原码、反码、补码、1的补码、2的补码

原码、反码、补码、1的补码、2的补码

计算机的有符号数涉及原码、反码、补码、1的补码(1’s complement/one’s complement)、2的补码(2’s complement/two’s complement)。最高位是符号位。最高位为“0”表示正数,最高位为“1”表示负数。计算机中保存的是补码。

反码就是1的补码,补码就是2的补码。

下面我们以8比特位的有符号数为例来说明。

原码

最高位表示符号位,剩余其它各位表示的值等于有符号数的绝对值。

2原码表示为:0000 0010

-2原码表示为:1000 0010

反码(即1的补码)

介绍

正数的反码:和原码相同。

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

1的补码(1’s complement/one’s complement)就是指 反码。对于无符号的数,没有符号位,那么1的补码就是将二进制的0取反变为1,1取反变为0,例如对0011求1的补码结果为1100。

举例

2的反码:因为2的原码是0000 0010,反码和原码相同,也是0000 0010。

-2的反码:因为-2的原码是1000 0010,所以反码是1111 1101。

在1的补码概念中,有两个0的表示

在1的补码概念中,有两个0的表示:

+0:0000 0000

-0: 1111 1111

1的补码可表示的数的范围

对于n比特表示的有符号数,1的补码能表示的数的范围是从-(2^(n-1) - 1)到2^(n-1) - 1。

例如8位比特,1的补码的表示范围是-127到127。

有符号数的1的补码的加法

介绍

1的补码的加法有循环进位(end-around carry),即先进行二进制数的相加,然后再把超过MSB(最高有效位)的进位丢弃,最后再把该丢弃的进位加到结果的LSB(最低有效位)上。

两个正数相加

8 + 4 = 12

8是正数,1的补码和原码相同,为0000 1000,

4是正数,1的补码和原码相同,为0000 0100

两者相加过程:

0000 1000 + 0000 0100 = 0000 1100,

符号位是0,表示正数,结果表示12。

一个负数和一个正数相加,且负数的绝对值小于正数

8 + (-4) = 4

8是正数,1的补码和原码相同,为0000 1000,

-4是负数,1的补码为1111 1011

两者相加过程:

1)0000 1000 + 1111 1011 = 1 0000 0011, 产生了一个超过最高有效位的进位,先丢弃该进位

2)再将该丢弃的进位加到0000 0011的最低有效位上,即0000 0011 + 1 = 0000 0100

符号位是0,表示正数,结果表示4。

一个负数和一个正数相加,且负数的绝对值大于正数

(-8) + 4 = -4

-8是负数,1的补码为1111 0111,

4是正数,1的补码和原码相同,为0000 0100

两者相加过程:

1)1111 0111 + 0000 0100 = 1111 1011, 没有产生超过最高有效位的进位

符号位是1,表示负数,结果表示-4。

两个负数相加

(-8) + (-4) = -12

-8是负数,1的补码为1111 0111,

-4是负数,1的补码为1111 1011

两者相加过程:

1)1111 0111 + 1111 1011 = 1 1111 0010, 产生了一个超过最高有效位的进位,先丢弃该进位

2)再将该丢弃的进位加到1111 0010的最低有效位上,即1111 0010 + 1 = 1111 0011

符号位是1,表示负数,结果表示-12。

补码(即2的补码)

介绍

正数的补码:和原码相同。

负数的补码:原码的符号位不变,其它各位取反,然后再加1。其实就是反码再加1。

2的补码(2’s complement/two’s complement)就是指补码,是1的补码基础上再加1。

举例

2的补码:因为2的原码是0000 0010,补码和原码相同,也是0000 0010。

-2的补码:因为-2的原码是1000 0010,反码是1111 1101,然后再加1,即得补码为1111 1101 + 1 = 1111 1110。

在2的补码概念中,只有一个0的表示

在2的补码概念中,只有一个0的表示:0000 0000。

因为+0表示为0000 0000,-0表示为1111 1111 + 1 = 1 0000 0000,而我们是以8比特位表示一个数来举例的,现在相加后出现了9位,所以最高位丢弃,结果就是0000 0000,跟+0的表示相同。

2的补码可表示的数的范围

对于n比特表示的有符号数,2的补码能表示的数的范围是从-2^(n-1) 到2^(n-1) - 1。

例如8位比特,2的补码的表示范围是-128到127。

在2的补码加法中,不需要考虑循环进位

在2的补码加法中,不需要考虑循环进位的问题。如果遇到超过MSB(最高有效位)的进位,直接丢弃进位。

已知补码,求原码

如果已知补码,那么对补码再求一次补码,即得原码。所以可知:

1)如果补码的符号位为“0”,表示正数,那么原码等于补码。

2)如果补码的符号位为“1”,表示负数,那么对该补码再求补码就是原码。

举例:

已知补码是0000 0010,符号位为“0”,表示正数,原码等于补码,即0000 0010,表示的数值是2。

已知补码是1111 1110,符号位为“1”,表示负数,原码等于补码再求补码,即1111 1110的符号位保持不变,其它各位取反,然后再加1,得到原码为:1000 0001 + 1 = 1000 0010,表示的数值是-2。

猜你喜欢 💖

杨丽萍洱海边的家,世界上最美的院子
5443655

杨丽萍洱海边的家,世界上最美的院子

📅 07-01 👁️ 9443
【抽奖平台开发(1)】抽奖功能的前端实现(HTML+JS+CSS)
世界杯巡礼:埃及 萨拉赫领军死拼出线权
365会被黑吗

世界杯巡礼:埃及 萨拉赫领军死拼出线权

📅 06-30 👁️ 6928