> 文档中心 > 原码、反码、补码及小数的存储

原码、反码、补码及小数的存储

一、了解机器数与机器数真值的概念

二、原码、反码补码

 

总结:正数: 三码合一(即正数的原码、反码、补码都一样)

           负数:  反码--->原码的最高位不变,其他位依次取反 

                      补码--->反码最后一位加1

            正数与负数在计算机中都是以补码形式存储的。

三、小数的存储

1.符号位:

整数符号位为0,负数符号位为1;

如:-99   ( 一个整数占4个字节,一个字节8位,所以一个整数需用32位来存储 )

二进制   原码   10000000  00000000  00000000 01100011

              反码   11111111    11111111    11111111   10011100   符号位不变,其他位依次取反

              补码   11111111    11111111    11111111   10011101    反码加1


 2、指数部分

float 的指数部分占用 8 Bits,能表示从 0~255 的值,取其中间值 127,指数在写入内存前先加上127,读取时再减去127,正数负数就显而易见了。19.625 转换后的指数为 4,4+127 = 131,131 换算成二进制为 1000 0011,这就是 19.626 的指数部分在 float 中的最终存储形式。

先确定内存中指数部分的取值范围,得到一个中间值,写入指数时加上这个中间值,读取指数时减去这个中间值,这样符号和值就都能确定下来了。

中间值的求取有固定的公式。设中间值为 med,指数部分占用的内存为 n 位,那么中间值为:
med = 2^(n  - 1 )-1
对于 float,中间值为 2^(8-1) - 1 = 127;对于 double,中间值为 2^(11-1) -1 = 1023。


3.尾数部分

将负数转化为二进制科学计数法,其小数部分就是需存储的尾数部分

如:二进制   -1111.11            其科学计数法写法:-1.111*e^3               

      二进制   1100.11101         其科学计数法写法:1.10011101*e^3

二进制   -1111.11         在小数存储中尾数部分就是  111

二进制   1100.11101   在小数存储中尾数部分就是    10011101

注意:

           1.数据存储时都是从左往右存储

           2.若是尾数部分不足(低于)所需要的尾数部分,那就添0补全;指数部分也是如此。

           3.常见的整型数默认为十进制(没有特别说明的都是十进制),常见的小数均默认为double类型(没有指定数据类型的小数都默认为double);指定了数据类型,按指定的数据类型来。

喜欢的可以加关注,以便及时查看日后更新的内容~~~~~