十进制
此部分摘抄于该博客
假设要对正数9按位取反——> (~9),计算步骤如下,
原码为 0000 1001,
反码为 0000 1001,
补码为 0000 1001,
(正数的原码=反码=补码)
对其取反 1111 0110(符号位一起进行取反,这不是反码更加不是最终结果,只是补码的取反仅此而已)
我们还需要把他转换成原码,因为是负数所以进行负数补码到原码的逆运算
先减1得反码: 1111 0101
取反得原码:1111 1010,(反码和原码是一个相对的概念,对反码取反就是原码。取反过程符号位是不变的哦)
前面4个1是符号位,1是负数,既得十进制:-10
这里步骤就是:
1. 先对正数求补码(就是原码本身)
2. 然后对补码取反,包括符号位
3. 最后进行一个补码求原码的过程,一定要搞清概念啊。
下面我们再反推计算 (~ -10)
-10的原码:1111 1010
-10的反码:1111 0101 (符号位不变)
-10的补码:1111 0110 (符号位不变,末位+1)
补码取反:0000 1001 (符号位一起取反)
这是一个正数,那么我们对其求原码就可得到最终结果?
因为正数的补码,反码,原码都是一样的 那我们的最终结果是 0000 1001 ,十进制是 9,这与我们前面推算出的结果吻合。
printf("%d\n",~7)//十进制输出 :-8
之所以出现-8在于结果溢出,比如
printf("%u\n",~7)//十进制输出 :4294967288
因此,输出结果为-8在于超过了int的范围
最后一个有趣的事实是:
1. 所有正整数的按位取反是其本身+1的负数
2. 所有负整数的按位取反是其本身其绝对值-1
3. 零的按位取反是 -1(0在数学界既不是正数也不是负数)
eg:234
十六进制
正数比如234 如图所示
负数
同正数的十进制做法,只不过最后以十六进制输出
十进制的99即为十六进制的63