1.整数所占字节数与能表示的十进制取值范围的对应关系(整数在内存中都是以二进制形式存储) 1)sizeof(int)=4,即int型数据占在内存中占32位
2)由于 int是signed int,所以32位中第一位用来表示符号,用来表示数值的位数只有31位
3)忽略符号位,31位能表示的最大数应为:2^0+2^1+.....+2^30=2^31-1
演示为何2^0+2^1+.....+2^30==2^31-1细节---由于32位过多,在此用8位展示与32位同理 2^0+2^1+...+2^6 --------------------------------> 01111111 2^7--->10000000 2^7-1--->10000000-1------->01111111 4)加上符号位表示正负,即int能表示的整数取值范围为:-2^31-1 ~ -0 && 0 ~ 2^31-1
疑问:为什么会有负零?
加上符号位的8位所能表示的数值范围为:
11111111 ~ 10000000 && 00000000 ~ 011111111 其中10000000即为负零.(32位同理)
5)又因为整数在内存中是以二进制的补码形式存储的,正负零都可以表示零, 正数的原码反码补码都一样,编码稳定.所以就用负零表示数值 -2^31, 因此int能表示的整数取值范围就变成了:-2^31~2^31-1
2. 负零表示数值 -2^31的由来及计算机为什么要采用二进制补码的形式存储数据? 现在 假设 整型占 2个字节即16位 此时0有两种表现方法,即正0和负0:0000000000000000=1000000000000000=0
所以,二进制原码表现时,范围是-32767~-0和0~32767.
原码的正0和负0:0000000000000000和1000000000000000,补码表现中,前者的补码还是0000000000000000,后者经过非符号位取反加1后,同样酿成了0000000000000000,也就是正0和负0在补码系统中的编码是一样的。但是,我们知道,16位二进制数可以表现2的16次方个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时酿成1000000000000000。所以,人为规定1000000000000000这个补码编码为-32768。 计算机中采取二进制补码存储数据,即正数编码稳定,从0000000000000000到0111111111111111依旧表现0到32767,而负数需要把除符号位当前的部分取反加1,即-32767的补码为1000000000000001。正因为如此,所以补码的表示范围比原码和反码表示的范围都要大,计算机中才会采取用二进制补码存储整型数据.
|