我们先来看这位网友的问题:
#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;
}
以后笔试面试再也不用怕了吧, 童鞋们。