【发布时间】:2018-05-05 05:37:44
【问题描述】:
这可能是一个非常基本的编程问题,但我一直想了解它。
考虑这个简单的例子:
int main(void)
{
unsigned char a = 5;
unsigned char b = 20;
unsigned char m = 0xFF;
unsigned char s1 = m + a - b;
unsigned char s2 = m - b + a;
printf("s1 %d s2 %d", s1, s2);
return 0;
}
鉴于在 C 中算术运算符是从左到右计算的,这里的第一个计算应该在 m + a 处溢出。但是,运行此程序会为 s1 和 s2 返回相同的答案。 我的问题是:第一个表达式是否会因为溢出而导致未定义的行为? 第二个表达式应该避免溢出,但我想了解为什么两个表达式返回相同的答案。
【问题讨论】:
-
不幸的是,这个问题的格式不正确。在进行算术运算之前,C 将整数操作数至少提升为
int,因此问题中的代码没有溢出。如果使用确实溢出的代码并得到相同的结果,答案将是编译器经常使用有效回绕的算术指令,因此即使发生中间溢出也可以获得数学上正确的答案。但是,不能依赖这种行为,因为它不受 C 标准的保证,并且各种事情都可能导致其他结果。
标签: c undefined-behavior integer-overflow