无符号整数溢出由C和C++标准很好地定义.例如,C99标准(§6.2.5/9)声明
涉及无符号操作数的计算永远不会过度流动,因为无法用结果无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模.
但是,这两个标准都声明有符号整数溢出是未定义的行为.再次,从C99标准(§3.4.3/1)
未定义行为的一个示例是整数流上的行为
这种差异是否存在历史或(甚至更好!)技术原因?
我目前正在使用一个使用代码的库
T& being_a_bad_boy()
{
    return *reinterpret_cast<T*>(0);
}
在没有实际存在T的情况下引用T.这是未定义的行为,特别指出标准不支持,但它不是闻所未闻的模式.
我很好奇是否有任何示例或平台或用法表明在实践中这可能会导致问题.谁能提供一些?
该问题来自 cs:app3e 2.82。我了解到,当x = INT_MIN,-x也是-INT_MIN,但是
#include <stdio.h>
#include <limits.h>
int main() {
    int x = INT_MIN, y = -3;
    printf("%d\n", (x < y) == (-x > -y));
    return 0;
}
在我的机器上(Linux版本6.2.0-34-generic(buildd@bos03-amd64-059)(x86_64-linux-gnu-gcc-11(Ubuntu 11.4.0-1ubuntu1~22.04)11.4.0,GNU ld(GNU Binutils for Ubuntu) 2.38)),这给出输出 1。为什么会发生这种情况?
我使用gcc -o来编译它。我还使用gcc -O0来编译它。