程序员的资源宝库

网站首页 > gitee 正文

二进制位运算

sanyeah 2024-04-13 16:33:53 gitee 5 ℃ 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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表