首页 > 其他分享 >数据的存储(day17)

数据的存储(day17)

时间:2022-11-28 21:31:08浏览次数:29  
标签:11111111 存储 00000000 char int day17 整型 数据

重点

整型与浮点数的存储。

数据类型

数据的存储(day17)_补码

意义

1)此类型开辟内存空间的大小。

2)在内存空间如何存储。

实例

int main()
{
int a = 10;
float b = 10.0;
short c = 10;
char d[] = "10";
return 0;
}

数据的存储(day17)_整型_02

数据的存储(day17)_补码_03

数据的存储(day17)_补码_04

数据的存储(day17)_数据_05

1个字节为8个bit位,转化为十六进制位2的8次幂=16的二次幂,也就是十六进制的两位,所以内存中以2位表示一个字节。

内存中,整型都是以补码形式存储,因为cpu硬件只有加法器

实例

计算 1+(-1)=0

数字1    :00000000  00000000  00000000  00000001(补码)

数字-1  : 11111111  11111111  11111111  11111111(补码)

结果     :  10000000  00000000  00000000  00000000

进一位  :  0000000  00000000  00000000  00000000

1.大端存储模式与小端存储模式

大端:数据的低位保存在内存的高地址,数据的高位保存到内存的低地址。

小端:数据的低位保存在内存的低地址,数据的高位保存到内存的高地址。

实例

数字20,整型会向内存四个字节,以16进制表现为:00 00 00 14

二进制表示

大端存储(内存地址)

00                高位

14      高地址

00

00           

00

00          

14                低位

00      低地址

二进制表示

小端存储(内存地址)

00                高位

00       高地址

00

00

00

00

14                低位

14       低地址

实例

int main()
{
int a = 19;
int* ap = &a;
char* app = (char*) & a;
printf("%d\n", *app);
return 0;
}

指针类型决定了指针解引用访问几个字节。(int型指针访问4个字节,char型访问1个字节)

指针类型决定了指针+1的步长                  (决定步长)

强制转化后,用char形指针接收int型数据,则char型指针只会访问int型数据的首个字节,这就是实现大小端存储判断的原因。

2.char型数据详解

char型数组会像内存中请求1个字节储存

有符号位的char

内存存储(补码)

   ±

原码

十进制表示

整型提升(对补码)

整型提升后的原码

整型提升后原码的十进制表示(略)

00000000

+

00000000

0

00000000  00000000  00000000  00000000



00000001

+

00000001

1

00000000  00000000  00000000  00000001



00000010

+

00000010

2

00000000  00000000  00000000  00000010



.....

+

.....

...

...



.....

+

.....

...

...



01111110

+

011111110

126

00000000  00000000  00000000  01111110



01111111

+

011111111

127

00000000  00000000  00000000  01111111



10000000

特殊


-128

11111111 11111111 11111111 10000000



10000001

-

11111111

-127

11111111 11111111 11111111 10000001



......

-

...

...

...



......

-

...

...

...



11111110

-

10000010

-2

11111111 11111111 11111111 11111110



11111111

-

10000001

-1

11111111 11111111 11111111 11111111 



无符号位的char

内存存储(补码)

   ±

原码

十进制表示

整型提升

00000000

+

00000000

0


00000001

+

00000001

1


00000010

+

00000010

2


.....

+

.....

...


.....

+

.....

...


01111110

+

01111110

126


01111111

+

01111111

127


10000000

+

10000000

128


10000001

+

10000001

129


......

+

...

...


......

+

...

...


11111110

+

11111110

254


11111111

+

11111111

255


实例

int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("%d\n%d\n%d\n", a, b, c);
return 0;
}

结果

-1
-1
255

a的原码  1000 0001

a的反码  1111 1110

a的补码  1111 1111

a的隐形整型化(补码为int型

11111111  11111111  11111111  11111111

a整形后的原码

11111111  11111111  11111111  11111110

10000000  00000000  00000000  00000001

整型打印为-1.

同理可得 signedchar整形后打印值也为-1.

补充:char的定义

C标准中对char是 Impementation Defined,就是未明确定义

(1)那它由什么定义?坦白说,具体的编译器明确定义,一般都是用signed char或unsigned char来实现char的,也就是说不同的编译器对char是什么定义不一样

(2)为什么要这样定义?因为这三种类型的对象在存储介质中的表现形式是一样的(都是一个占8bit的01串,只是解析的时候不同)

(3)到底是signed char还是unsigned char?这得看编译器:VC编译器、x86上的GCC都把char定义为signed char,而arm-linux-gcc却把char定义为 unsigned char

对于unsigned类型

c的原码   1111 1111(0-1后溢出再截取)

c的反码   1111 1111

c的补码   1111 1111

c的隐形整型化(补码为unsigned int型

00000000  00000000  00000000  11111 1111

整型打印百分制为255.

实例

int main()
{
char a = -128;
printf("%u\n", a);
return 0;
}

结果

4294967168

a的原码 1111  1111

a的反码 1000  0000

a的补码 1000  0001

a的整型化(默认整型化为int型)

  11111111  11111111  11111111  1000  0001

打印为unsigned int型

4294967168

在内存中,char 与unsigned char没有什么不同,都是一个字节,8个bit,普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高位而已。

无符号位char型补的都为0,而带符号位char型补的为符号位。

数据的存储(day17)_补码_06

3.float型数据详解

数据的存储(day17)_补码_07

数据的存储(day17)_数据_08

S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF

S:符号位,正数时为0,负数时为1

E:指数位

F:有效数字,大于1小于2,因为前面必有1,所以FFFFFFFFFFFFFFF存储的仅为小数部

数据的存储(day17)_整型_09

数据的存储(day17)_整型_10

注:E为指数,但有可能为负值,但在IEEE中规定E为无符号数(以float为例)。即在E区只能存储0~255这256个整数。为了区分正负,用中间数127(double类型为1023)作为分界点,当指数位为-1时,加上127在E区存储126,同理当指数位为-126时,在E区存储值1.所以实际上能存储的指数值为-127~128.

实例

int main()
{
float a = -5.5;
//S = 1;
//去除正负号后的二进制表示:101.1
//101.1=1.011*2^2
//E存储指数位 2+127 = 129
// 转化为二进制 1000 0001
//F存储有效数字的二进制小数位 0.11 补为23位 0110 000000000
//则内存存储为: 1 1000 0001 0110 000000000
// 11000000101100000000000000000000
//1100 0000 1011 0000 0000 0000 0000 0000
// c 0 b 0 0 0 0 0
// c0 b0 00 00
return 0;
}

结果

数据的存储(day17)_数据_11

注意为大端存储

所以低地址存低位高地址存高位。

特例

E区全为0

即指数取到-127,默认根据符号位只取±0

E区全为1

即指数取到128,默认根据符号位只取±∞

标签:11111111,存储,00000000,char,int,day17,整型,数据
From: https://blog.51cto.com/u_15862591/5893732

相关文章