原反补

数的二进制表示(假设有w位):

从右到左分别为 2的0次,2的1次,2的2次...2的w-1次。

无符号数:

假设w=8,现在要表示237

237 = 128 + 64 + 32 + 8 + 4 +1

接下来说有符号数,有三种表示形式

1. 原码

最左边(第一位)作为符号位决定正负,其余位表示值(其余位就跟无符号一样算)。

对于计算机来说,判别符号位非常难。

于是有了反码。

2. 反码

最左边(第一位、最高有效位) 是 ,其他都跟无符号数一样

显然,无论原码还是反码,它们对于数字0都有两种不同的编码方式,这不好。于是有了补码

3. 补码

几乎所有的现代机器都使用补码。如果你在一个C语言程序里看见了个有符号类型的,那么它使用的就是补码没跑了。

最左边(第一位、最高有效位)取。其他位保持不变

比如令w=8, -57 = (-128 + 64 + 4 + 2 +1)

由此可进行一些推导:

正数的补码、反码用不到第一位 -> 正数的补码、反码=原码;

接下来讨论负数:

先做一个错误的假设:反码只有一个0(实际上有两个,即+0和-0)。把原码除第一位外和反码相应位相加结果如果刚好是全1,等于反码的零。 -> 原码转反码就是除了符号位外(即不管符号位),每一位都取反。

补码就是第一位比反码多减了个1 -> 补码=反码+1

ps:假设w=8,1111 1111 + 1 = 1 0000 0000,最前面的1溢出了,去掉。所以结果是0。

你可能感兴趣的:(原反补)