给定一个整数,要你求出它的相反数。你怎么做?这是前几天在csdn编程挑战中看到的一个问题,开始我想的是这样做。
int X(int key) { return -key; }
当然你可以使用2次减法,像这样
int X(int key) { int result = key; result -= key; result -= key; return result; }
后来想了一下换成下面这样的形式
int X(int key) { key = ~key; key += 1; return key; }
先对key取反,然后再加1.你可能觉得这样不直观。但是如果你编译一下,函数的确是返回key的相反数。这是为什么呢?让我们来看看有符号整数在计算机中的二进制表示:
+1 : 00000001 -1 : 11111111 +5 : 00000101 -5 : 11111011 //采用的是八位整数 //有符号数最高位表示正负 //1为负,0为正
如果仔细观察会发现把他们的二进制相加都是 100000000,由于采用的是8位小数,第九位的1溢出了,于是结果变成了 00000000,也就是0。这不就是相反数相加起来得0?
于是上面的第三个X函数就这样工作了。这和原码,反码,补码有一点关系,具体你可以看看这篇文章
现在看看这些二进制的东西,感觉自己对编程的理解又稍稍深入了那么一点。C语言是个好东西,可以用一辈子。:)
暂无评论
写评论