Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C(HW)中仅使用位运算符的饱和有符号整数加法_C_Bit Manipulation_Addition - Fatal编程技术网

C(HW)中仅使用位运算符的饱和有符号整数加法

C(HW)中仅使用位运算符的饱和有符号整数加法,c,bit-manipulation,addition,C,Bit Manipulation,Addition,对于家庭作业,我必须用C编写一个函数,将两个有符号整数相加,但如果出现正溢出,则返回INT_MAX,如果出现负溢出,则返回INT_MIN。在我可以使用的操作符中,我必须遵守非常严格的限制。所有整数都是2的补码形式,右移是算术运算,整数大小是可变的(我可以通过sizeof(int)>w-1找到它)&0x01//符号位Y int resultSign=(结果>>w-1)&0x01//结果符号位 int canOverflow=~(signX^signY)//如果它们是同一个符号,它们可能溢出 int

对于家庭作业,我必须用C编写一个函数,将两个有符号整数相加,但如果出现正溢出,则返回INT_MAX,如果出现负溢出,则返回INT_MIN。在我可以使用的操作符中,我必须遵守非常严格的限制。所有整数都是2的补码形式,右移是算术运算,整数大小是可变的(我可以通过sizeof(int)>w-1找到它)&0x01//符号位Y int resultSign=(结果>>w-1)&0x01//结果符号位 int canOverflow=~(signX^signY)//如果它们是同一个符号,它们可能溢出 int-didfoverflow=(resultSign^signX)&canOverflow//如果输入符号相同而结果符号不同,则为1,否则为0 }
我试图按照中所示的答案进行操作,但我被困在了一个部分,除了符号位(1到0111..11,0到0000.00)之外,我必须用相同的位填充一个整数。我不知道“轮班和轮班的结合”是什么。我想你误解了答案。您应该做的是将符号位扩展到所有的位,包括MSB。这可以通过获取包含符号位的int来实现,例如,
didfoverflow
,并将1添加到其补码中

然后,您可以找到在出现溢出的情况下应该返回哪个溢出值。这可以通过使用扩展的
signX
(或
signY
)对
INT\u MAX
进行XORing来实现。让我们调用这个值
overflow
。最后,如下更改
溢出
结果

overflow := (extended didOverflow) AND overflow
result := (NOT (extended didOverflow)) AND result
现在,在这些赋值之后,如果扩展的
溢出
是1…1,那么
溢出
显然将保持不变<另一方面,代码>结果将等于0

但是如果
didfoverflow
为0…0,则相反的情况适用:
overflow
现在为0,而
result
保持不变


在第一种情况下(其中,
didfoverflow
为1…1,表示存在溢出),
溢出或结果
等于
溢出
。在第二种情况下(没有溢出),
溢出或result
等于
result
。因此,无论哪种方式,
溢出或结果
都将为我们提供正确的值。

为什么要投反对票?这似乎很有道理。
overflow := (extended didOverflow) AND overflow
result := (NOT (extended didOverflow)) AND result