关于有符号整数溢出在 C/C++ 中是未定义行为 (UB) 的讨论
事件起因


关键问题
编译器把 !(x + x + 2) 优化成 x == -1,而不会把 y = x + x + 2 的计算过程优化。
问题结论
编译器之所以能把!(x + x + 2)变成x==-1,核心原因是 “有符号整数溢出在 C/C++ 中是未定义行为(UB)”,可以看看这个帖子:https://stackoverflow.com/questions/18195715/why-is-unsigned-integer-overflow-defined-behavior-but-signed-integer-overflow-is
gcc编译时开-fwrapv或者-fno-strict-overflow可以关闭这个优化





与ChatGPT-o3的讨论https://chatgpt.com/share/6808a810-01f0-800b-a1bb-45c0ef407e24