二进制位运算
1. 数的原码补码转换
计算机运算中,数都是由补码表示的。正数的补码就是原码;负数的补码就是各位(包括符号位)取反,再加上1。假设数是8位的,最高位为符号位。1的补码是0x00000001,-3的补码是0xFFFFFFFD。
如果由补码转化为原数:正数不变;负数的补码是各位(包括符号位)取反,再加上1得到负数的绝对值,再贴上符号。补码0x00000010的数是1,补码0xFFFFFFE4的数的绝对值是000111002=2810,则该数是-28。
下面代码的输出是-30:
1 #include <stdio.h> 2 3 int main() { 4 int myInt; 5 myInt = 0xFFFFFFE2; 6 printf("%d\n",myInt); 7 8 return 0; 9 }
2. 对负数取补码,为什么要对绝对值的原码取反加1?
以-75为例。注意,7510=010010112。对-75取得它的机器表示,也就是0-75,下面是转换的过程:
可以看到,-75的机器表示的过程=28-75=11111111+1-01001011=11111111-01001011+1。而11111111-01001011相当于对75取反码,所以-75的取补码过程就是对75先取反码,然后加1。所以,推广得来看,对于负数的补码,要对该负数的绝对值的原码取反加1。
参考:
https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html#fromtwo