码迷,mamicode.com
首页 > 其他好文 > 详细

二进制位运算

时间:2016-07-11 23:42:18      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:

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

二进制位运算

标签:

原文地址:http://www.cnblogs.com/Deribs4/p/5661943.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!