以32位操作系统为例:(在实际计算机中数值的存储都是按数值补码存储的,在此介绍过程中是以原码介绍的)
整数存储:
无符号类型:所有bit都是有效数据位
以unsigned char为例,sizeof(unsigned char)等于1,也就是说unsigned char占用8bit,使用8个二进制数据表示其数值。那么unsigned char 的最大值就是1111 1111(全1)对应255,最小值就是0000 0000(全0)
有符号类型:最高1个bit位是符号位0代表正数,1表示负数,其余bit位是有效数据位
以signed char为例,signed char依然占用8bit,但是最高位表示符号位占用1个bit,所以有效数据位就是剩余7个bit。signed char的最大值是0111 1111(最高位0表示正数)对应127,最小值是1111 1111(最高为1表示负数)对应-127。(注意这是按原码介绍的,实际过程应该是1000 0001)
小数存储:
无论是单精度小数还是双精度小数,在存储中从高到低都分为三个部分。
(1)符号位 0代表正,1代表负
(2)指数位 用于存储科学计数法中的指数数据,并且采用移位存储(指数+127)
(3)尾数部分
float 的符号位占1位,指数位占8位,尾数部分占23位 // 总共32位,4字节
double 的符号位占1位,指数位占11位,尾数部分占52位 // 总共64位,8字节
1、173.8125f(f表示该值是float类型):
将十进制小数173.8125f转化为二进制小数
即
173.8125f的二进制小数是然后再转成科学计数法。
173.8125f的内存表示:符号位是0(正数),指数位127+7(10000110),尾数位010 1101 1101 0000 0000 0000。(科学计数法中的1不在内存中存储)
2、0.125f的内存存储表示:二进制小数0.001,科学计数法:1.0×10﹣³
符号位0,指数位1111 1100,尾数位001 0000 0000 0000 0000 0000
负数在内存中的存储是其正数包括符号位全部取反再加1的结果:
以int 173(0000 0000 0000 0000 0000 0000 1010 1101)为例:
第一步包括符号位全部取反:1111 1111 1111 1111 1111 1111 0101 0010
第二步取反结果加1:1111 1111 1111 1111 1111 1111 0101 0011(-173)
现在再来看signed char的最小值-127的表示过程:
+127:0111 1111
全部取反:1000 0000
再加1:1000 0001
扩展:
原码:十进制、八进制、十六进制转二进制加符号位的结果
反码:除原码的符号位,其余取反的结果
补码:反码加1的结果。
注意:正数的原码、反码、补码是一样的。
以十进制+111为例:+111的二进制是0000 0000 0000 0000 0000 0000 0110 1111这是原码也是反码和补码;
-111的原码:1000 0000 0000 0000 0000 0000 0110 1111
-111的反码:1111 1111 1111 1111 1111 1111 1001 0000
-111的补码:1111 1111 1111 1111 1111 1111 1001 0001