【发布时间】:2013-10-13 10:07:22
【问题描述】:
对于家庭作业,我必须用 C 语言编写一个函数,将两个有符号整数相加,但如果出现正溢出则返回 INT_MAX,如果出现负溢出则返回 INT_MIN。对于可以使用的运算符,我必须遵守非常严格的限制。所有整数都是二进制补码形式,右移是算术,整数大小是可变的(我可以用 sizeof(int)
我知道如果两个输入具有相同的符号并且结果具有不同的符号,则可以检测到溢出。我已经到了有一个标志显示等式是否溢出的地步。我不知道如何从那里到达最终产品。这是我到目前为止所拥有的:
int saturating_add(int x, int y){
int w = sizeof(int)<<3;
int result = x+y;
int signX = (x>>w-1)&0x01;//Sign bit of X
int signY = (y>>w-1)&0x01;//Sign bit of Y
int resultSign = (result>>w-1)&0x01; //Sign bit of result
int canOverflow = ~(signX ^ signY); //If they're the same sign, they can overflow
int didOverflow = (resultSign^signX)&canOverflow; //1 if input signs are same and result sign different, 0 otherwise
}
我正在尝试遵循Bitwise saturated addition in C (HW) 中显示的答案,但我被困在必须用相同位填充除符号位之外的所有整数的部分(1 转到 0111..11 0 到 0000.00)。我不知道“班次和 OR 的组合”是什么。
【问题讨论】:
-
为什么投反对票?这似乎足够有效。
标签: c bit-manipulation addition