先来谈谈补码的非
补码的非
根据CASAPP,第59页,有如下公式
二进制的减法
减法运算其实是可以由加法运算替代的,我们上面已经介绍过了无符号和补码的非,其实很多CPU是没有减法运算器的,它们都是将减数进行逆运算以后送入加法器,然后进行加法运算,这样得出来的结果就是减法运算最终的结果。
X + Y 就是 X+Y的加法逆元(非)
一种特殊情况
TMIN应该注意,他的加法逆元是他本身。这点在CASPP练习题2.32上有体现
我们来看一下原题
练习题2.32 你现在有个任务,编写函数tsub_ok的代码,函数的参数是x和y,如果计算x-y不产生溢出,函数就返回1。假设你写的练习题2.30的代码如下所示:
/* determine whether arguments can be subtracted without overflow */
/* WARNING: THIS code is buggy */
int tsub_ok(int x,int y) {
return tadd_ok(x,-y);
}
x和y取什么值时,这个函数会产生错误的结果?写一个该函数的正确版本
int tadd_ok(char x,char y)
{
char sum = (char)x + y;
printf("sum is %d,y is %d\n",sum,y);
int neg_over = x < 0 && y < 0 && sum >= 0;
int pos_over = x >= 0 && y >= 0 && sum < 0;
return !neg_over && !pos_over;
}
其中情况如下
修改如下
int tsub_ok(int x, int y)
{
if (y < 0 && -y < 0) /* y是否为最小负数 */
{
return x < 1;
}
else
return tadd_ok(x, -y);
}
时间: 2024-10-24 21:35:16