二进制位运算

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

转载于:https://www.cnblogs.com/Deribs4/p/5661943.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值