【发布时间】:2020-10-22 06:03:01
【问题描述】:
我在 C 中处理整数,试图更多地探索溢出发生的时间和方式。
我注意到当我将两个正数相加时,总和溢出,我总是得到一个负数。
另一方面,如果我将两个负数相加,其和溢出,我总是得到一个正数(包括 0)。
我做了一些实验,但我想知道这是否适用于每种情况。
【问题讨论】:
-
下溢和上溢对于有符号整数是未定义的,但对于无符号整数是明确定义的。假设您添加的那些正值不是无符号的,那么可能会发生任何事情。
-
虽然“未定义”,但几乎每台现代计算机都使用“2 的补码”算术,因此出于实际目的,它被定义并按照您的想法工作,除了少数“边界”我现在无法理解的情况。
-
@HotLicks,你让我想起了this C++ question,那里发生了一个异常。
-
@chris -- 当然,在那种情况下,算术确实(显然)换行了,只是编译器假设算术不会传递到“未定义”区域,因此优化了测试. “未定义”规则用于允许优化,如果包装行为在规范中是不可能的。
-
@HotLicks,这就是为什么 C++ 中的 UB 是一个好的东西:D