负数补码和负数本身进行转换的一个好方法---解答一网友的疑问

      我们先来看这位网友的问题:

 

     ~123的返回值就为-124? 先将123转成二进制数01111011,然后各位取反得10000100,最后得-124。  为什么答案是-124? 
 
      我确实有点实证主义了, 还是用代码来验证一下(为了简便起见, 我们仅仅考虑8位):
#include <stdio.h>

int main()
{
	char a = 123;
	char b = &a;
	printf("%d\n", b);  // -124

	return 0;
}

     我们知道:

 

     x + y = z等价于: x补 + y补 = z补码

     而且, 我们知道, 对于正数有:源码=反码=补码, 而大家总是记忆不清负数补码的求法, 下面, 我们用如下方法来简答求解负数的补码:

     x补 + (~x)补 = 11111111B, 这刚好就是-1的补码, 我们简记为: x + ~x = -1   (也由此可知, 上面问题的结果为-124)

 

     现在假设我们要求-124的补码, 显然有123 + (-124) = -1, 也就是说, 123的补码和-124的补码完全相反, 我们知道123的补码是01111011, 所以-124的补码为10000100.

     

     好, 我们来做两个简单的题目:

 

    比如我们要求-66的补码, 我们先求65的补码, 也就是01000001, 所以-66的补码是10111110.

    那要是已知负数的补码, 求负数本书, 好不好做呢? 好做, 假设某负数的补码是10001111, 好, 其反面形式是:01110000, 对应的正数是112, 所以, 这个负数是-113.

 

    下面, 我们以一个验证程序结束本文:

 

#include <stdio.h>

int main()
{
	printf("%0x\n", -66);  // ffffffbe, 后面8位是:10111110
	printf("%0x\n", -113); // ffffff8f, 后面8位是:10001111

	return 0;
}


     以后笔试面试再也不用怕了吧, 童鞋们。

 

 

      

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值