在IT技术中,如何将两个有符号或无符号整数相加?

10

我已经很久没有在位和字节级别上编程了,想确认一下我似乎记得的东西:

假设我有两个长度相等的整数(1、2、4、8个字节;不重要),并将它们加起来:如果它们是有符号或无符号的,它们的按位结果是否会有所不同。换句话说:不管它们是有符号还是无符号整数,它们的位最终是否相同?

我的直觉和脆弱的记忆告诉我它们会相同,但我只是想确认一下。谢谢。


1
据我所知,尽管结果看起来没问题,但C/C++标准规定整数溢出会导致未定义的行为。编辑:无符号算术不会溢出,并按照通常的方式进行包装。 - nhahtdh
@nhahtdh:谢谢,没关系。我标记了C++,因为我认为这是一个很好的询问受众,但我将在另一种语言中使用它。 - Eduardo
2
https://dev59.com/HWox5IYBdhLWcg3wtmc1 - nhahtdh
2个回答

13
假设实现使用二进制补码作为带符号整数的表示方式,则结果将相同。在其他表示方式下,结果将不同。
编辑
正如评论中指出的那样,有符号加法的溢出是未定义行为,这意味着在这种情况下无法对结果进行任何说明。

我希望我能给你投两票:一票是为了答案,另一票是为了确认我的记忆没有那么糟糕 :-) - Eduardo
1
@Eduardo,我来投出第二张赞成票。很好,简短,正确的答案。 - Lindydancer
3
当在加法运算中引用未定义行为时,它们也不会发生。 - PlasmaHH

4

我知道这个问题已经被回答了,但是我曾经使用过的所有处理器(大约有十几种不同的架构 - 我指的是架构而不是不同的风味)只有一种类型的ADD指令 - 它可能有不同的大小选项,但它是唯一的指令。减法也是如此。乘法和除法上则不同,通常具有有符号和无符号的变体 - 或以某种方式要求输入进行“符号调整”。

唯一还区分有符号和无符号的其他指令是条件指令,例如:“小于跳转”将具有一个用于“无符号小于”的变体和一个用于“有符号小于”的变体(其中一个通常被称为“小于”的其他名称,例如“以下”或“进位设置”等)。


这是一个非常好的观点 - 即使标准规定行为未定义,它不太可能执行底层CPU架构不支持的操作。这不符合C和C++的工作方式。 - Mark Ransom
1
@MarkRansom 这真的取决于上下文。nhahtdh上面链接的问题展示了编译器介入的一个例子。 - Angew is no longer proud of SO
当然,可能会有一些CPU对于“加”和“减”有不同的有符号和无符号指令,但我还没有见过一个[甚至听说过一个]。C/C++规范是由语言律师编写的,他们必须满足各种奇怪的硬件要求。这并不意味着我们经常会看到那种类型的硬件... ;) - Mats Petersson
MIPS有两个(实际上是四个,因为有加立即数的指令)ADD指令:一个会触发异常,另一个则不会。 - user784668
这是针对有符号还是无符号值的溢出陷阱? - Mats Petersson
其实,我想知道在处理器级别上是否有任何区别(我没有记得有什么体验上的不同)。感谢您对答案的进一步完善。 - Eduardo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接