整数和小数在内存中二进制表示

以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

猜你喜欢

转载自blog.csdn.net/u010196624/article/details/77159458