在之前的文章介绍了计算机是如何存储浮点数的,本节内容在介绍下计算机是如何存储整数的。
首先了解下原码、反码和补码的概念。
原码、反码和补码都是数值的一种二进制表现形式。
原码第一位为符号位,其余为数值位,如果用8位二进制的原码表示十进制的 1 和 -1。
十进制 | 原码 |
---|---|
+1 | 0000 0001 |
-1 | 1000 0001 |
正数和负数的反码表示方法,有所区别。
十进制 | 原码 | 反码 |
---|---|---|
+1 | 0000 0001 | 0000 0001 |
-1 | 1000 0001 | 1111 1110 |
正数和负数的补码形式表现也有所不同。
十进制 | 原码 | 反码 | 补码 |
---|---|---|---|
+1 | 0000 0001 | 0000 0001 | 0000 0001 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
正数的原码、补码和反码完全一致,而负数原码、补码和反码完全不同,所以在计算负数的二进制机器数时,要十分小心。
计算机底层实际存储的是整数的补码,实际过程大概如下:
1)输入 -1;
2)转换为原码 1000 0001
;
3)转换为反码 1111 1110
;
4)转换为补码 1111 1111
;
所以在得到一个整数的机器数时,想要获得它表示的真实数值,不能直接将其转换为十进制,应该首先将其转换为反码,在转换为原码,最后将得到的原码转换为十进制数值(注意得到的原码第一位是符号位,不要转换错误)。
举个例子,补码为 1111 1001
,求十进制数。
1)转换为反码,补码减一得到反码 1111 1000
;
2)转换为原码,符号位不变,其余位按位取反得到原码 1000 0111
;
3)将原码转换为十进制数,符号位为 1
,所以结果为 -7
。
所以 -7
就是计算机存储的 1111 1001
表示的真实值。
注意:如果采用 8 位二进制存储整数,那么补码
1000 0000
表示的-128
,计算机中一个8位的二进制数的存储范围是用补码表示的[-128,127]
,而不是用原码或反码表示的[-127,127]
。所以计算机中一个字节的取值范围是[-128,127]
。
(完)