二进制位运算

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

https://en.wikipedia.org/wiki/Two%27s_complement

posted @ 2016-07-11 22:48  Deribs4  阅读(763)  评论(0编辑  收藏  举报