#M8317. 数据编码

数据编码

机器数


一个数在计算机中的二进制表示形式,叫做这个数的机器数

机器数具备两个特点:

【1】符号数字化,实数有正数和负数之分,计算机内部硬件只能表示两种物理状态( 01 ),因此数的正号或负号在计算机里需要用一位二进制来区别。在计算机用机器数的最高位存放符号,以 0 代表符号“ + ”,以 1 代表符号“ - ”

【2】数字大小受机器字长的限制,机器内部设备一次能表示的二进制位数叫机器的字长,一台机器的字长是固定的。字长 8 位(bit)叫一个字节(Byte),机器字长一般都是字节的整数倍,如字长 8 位、16 位、32 位、64 位。

例如: 当计算机字节长为 8 位时

十进制 +5 转换为二进制就是 0000 0101

十进制 -5 转换为二进制就是 1000 0101

这里的 0000 01011000 0101 就是机器数。


真值


因为第一位是符号位,所以机器数的形式值就不等于真正的数值。

以机器数 1000 0101 为例,其真正表示的值(首位为符号位)为 -5,而形式值(首位就是代表 128)为 133;因此将带符号的机器数的真正表示的值称为机器数的真值。

对于一个数字,计算机要使用一定的编码方式进行存储,原码、反码、补码是机器存储一个具体数字的 3 种具体编码方式。


原码


原码的表示与机器数真值表示的一样,即最高位为符号,0 代表正数,1 代表负数,其余位表示数值。

正数: 就是它对应的二进制数。

负数: 将绝对值对应的二进制最左边位变为 1。

例如: 当计算机字节长为 8 位时

[+1] = [0000 0001]原

[-1] = [1000 0001]原

第一位是符号位,只表示正负,8 位二进制数原码的取值范围是:[1111 1111 , 0111 1111],即[-127 , 127]


反码


正数: 和原码相同。

负数: 在其原码的基础上,符号位不变,其余各位取反。

例如: 当计算机字节长为 8 位时

[+1] = [0000 0001]原 = [0000 0001]反

[-1] = [1000 0001]原 = [1111 1110]反

如果一个反码表示的是负数,人脑无法直观的看出来它的数值。通常要将其转换成原码再计算。

第一位是符号位,只表示正负,8 位二进制数反码的取值范围时:[1000 0000 , 0111 1111],即[-127 , 127]


补码


正数: 补码是其原码本身。

负数: 补码是在其原码的基础上,符号位不变,其余各位取反后加 1 (即在反码的基础上加 1)。

[+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补

[-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补

对于负数,补码表示方式也是人脑无法直观看出其数值的。也需要转换成原码再计算其数值

第一位是符号位,只表示正负,8 位二进制数补码的取值范围是:[1000 0000 , 0111 1111],即[-128 , 127]

小结


1、所以正数的原码、反码、补码都相同。

2、计算机中负数都是以补码形式存在的。

在补码运算中,[1000 0000] 补其实就是 -128,但实际上将以前的 -0 表示为 -128 的补码形式,所以 -128 并没有原码和反码表示。(对 -128 的补码表示 [1000 0000] 补,算出来的原码是 [0000 0000] 原,是不正确的)

使用补码,不仅仅修复了 0 的符号以及存在两个编码的问题,而且还能够多表示一个最低数。这就是为什么 8 位二进制,使用原码或反码表示的范围为 [-127, +127],使用补码表示的范围为 [-128, 127]。

数据在计算机中的存储形式


计算机实际只存储补码,所以原码转换为补码的过程,也可以理解为数据存储到计算机内存中的过程:

总结(牢记)


二进制的最高位是符号位:0表示正数,1表示负数(把 1 平放就是负号 '-')。

正数的原码反码补码都一样,三码合一。

负数的反码 = 它的原码符号位不变,其它位取反。

负数的补码 = 它的反码 + 1, 负数的反码 = 负数的补码 - 1 。

0 的反码、补码都是 0 。

在计算机运算的时候都是以 “补码” 的方式来运算的。 当我们看运算结果的时候,要看它的原码(重点)。