原码、反码、补码,-128、+128、-0、+0、-1的反码和补码

感悟分享,多有不足,若有误解,还望指正。

有符号的数在计算机中存储时最高位是符号位,正数符号位是0,负数的符号位是1,且在计算反码补码的过程中符号位是不参与变换的,但是,符号位并不是固定在最高位不会动的(后面解释)。

他们的计算规则:正数的原码反码补码都是相同的,负数的反码是原码的数据位取反,补码则是在此基础上加1。

这时候你掌握了基本规则,但是你渐渐为发现,有一些特殊的数字,让人晕头转向,比如-128,+128,-1以及+-0,以8位为例(char类型)

在将这些之前我们要知道回环的概念,例如8位有符号数,从0一直加1直到127时,再加1就会变成-128,继续加1直到-1,再加1会变成0,然后重复上述就是回环(实际上就是溢出了,由于类型限制所以截取8位又回到了0)。

为什么 + 127 + 1会变成 - 128 ?是因为计算机存储的是补码,127的补码是0111 1111,再加1就是1000 0000,即是-128。

至于为什么1000 0000表示-128,这我们要从无符号的数看,在计算机中数字是二进制存储的补码,无符号数的三码又是一样的,所以从0到255对应的补码就是0000 0000~1111 1111,而负数也需要补码去存储,所以就从0~127、-128~-1就映射到0~255的补码上,然后就得到如结尾的对应关系

我们先看+128,这个数不属于8位的范围(-128~+127),+128实际是1 0000 0000,所以在8位数里只有0000 0000

然后是 + - 0 和 -128

原码反码补码
+00000 00000000 00000000 0000
-01000 00001111 11110000 0000(有溢出)
+1270111 11110111 11110111 1111
-128

1000 0000

从表格中我们能看到 + - 0 的补码是相同的,是因为 - 0 从反码到补码溢出了才导致补码相同,而我们若是从补码反推,你会发现根本推不出 - 0 这个数,这就导致在计算机眼中 0 这个数是没有正负的,但是它们的原码和补码是不同的

然后是-128,这个数是没有原码和反码的,这个数比较特殊,它是由 + 127 的补码加 1 之后才有的,在计算机中 + 127 的补码是 0111 1111,加 1 就是1000 0000,但是你若是推算它的反码和原码,你会发现和 - 0 一模一样,然后你若是再拿着刚推导出的原码去推补码,你会发现变成0000 0000了,所以 - 128 是没有反码和补码的(你可以认为三码的转换规则不适用-128,这是个特例)

我们来说一下符号位,这应该是很迷惑的东西,首先明白符号位和数据位,符号位在数据位的最前方,并且它是不会改变的,但是他的位置并不是固定的,他会随着数的变大被迫向左位移,比如你定义一个8位的数0111 1111,这是127,你再加1,他就变成 0 1000 0000,数字0依然是符号位,1000 0000是数据位,这样看他就是+128,但是由于它是一个8位的数,他就被截取成了1000 0000,然后由于数据类型是有符号的,最前面的1在计算中就被当作符号位,就变成了负数。

无符号和有符号数的补码以及映射关系。如下所示:

+----------------------------+

| 255      -1      11111111  |

| 254      -2      11111110  |

| 253      -3      11111101  |

| 252      -4      11111100  |

| 251      -5      11111011  |

| 246      -10     11110110  |

| 236      -20     11101100  |

| 226      -30     11100010  |

| 216      -40     11011000  |

| 206      -50     11001110  |

| 196      -60     11000100  |

| 186      -70     10111010  |

| 156      -100    10011100  |

| 129      -127    10000001  |

| 128      -128    10000000  |

| 127      127     01111111  |

| 100      100     01100100  |

| 70       70      01000110  |

| 60       60      00111100  |

| 50       50      00110010  |

| 40       40      00101000  |

| 30       30      00011110  |

| 20       20      00010100  |

| 10       10      00001010  |

| 5        5       00000101  |

| 4        4       00000100  |

| 3        3       00000011  |

| 2        2       00000010  |

| 1        1       00000001  |

| 0        0       00000000  |

+----------------------------+

  • 25
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值