原码、反码、补码

预备知识

  由计算机的硬件决定,任何存储于计算机中的数据,其本质都是以二进制码存储,一个二进制称为1个Bit,而8个Bit组成一个字节,字节通常是数据存储的基本单位。

计算机中的数据存储

计算机中的存储通常以字节为单位,一个字节数8位,即1B(byte)=8b(bit),一个英文是一个字节,而一个汉字是两个字节。
假设有4个比特位:
 表示无符号正数,就是0 ~ 15
 表示有符号整数,那么其中一半给到+1 ~ +7,另一半给到-1 ~ -7

方法1:正数加上负号即对应负数

既然0010表示+2,那么如果最左边的bit位替换成1就表示对应的负数,即1010表示-2

0000 0 0100 4 1000 -0 1100 -4
0001 1 0101 5 1001 -1 1101 -5
0010 2 0110 6 1010 -2 1110 -6
0011 3 0111 7 1011 -3 1111 -7
这就是原码,但是此时会导致出现0和-0,这两个值在数学意义上的意思相同,二进制编码却不同
并且此时2+(-2)=0010+1010=1100=-4,是时候采用新的编码方法了

方法2:翻转

既然0010表示+2,那就将所有进制反转表示负数不就行了,即1101表示-2

0000 0 0100 4 1111 -0 1011 -4
0001 1 0101 5 1110 -1 1010 -5
0010 2 0110 6 1101 -2 1001 -6
0011 3 0111 7 1100 -3 1000 -7
这就是反码,此方法也会导致0和-0的二进制值不相同
此时2+(-2)=0010+1101=1111=-0,也勉强可用,但有没有更好的方法?

方法3:补码

在负数反码的基础上如-2(1101)加上(0001)得到(1110)
此时2+(-2)=0010+1110=10000此时我们可以放心的忽略掉该进位即变成0000=0
补码表为:

0000 0 0100 4 1000 -8 1100 -4
0001 1 0101 5 1111 -1 1011 -5
0010 2 0110 6 1110 -2 1010 -6
0011 3 0111 7 1101 -3 1001 -7
原文地址:https://www.cnblogs.com/cokefentas/p/14754859.html