感悟分享,多有不足,若有误解,还望指正。
有符号的数在计算机中存储时最高位是符号位,正数符号位是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
原码 | 反码 | 补码 | |
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | 0000 0000(有溢出) |
+127 | 0111 1111 | 0111 1111 | 0111 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 |
+----------------------------+