【发布时间】:2014-11-16 12:05:48
【问题描述】:
我了解整数下溢和上溢是未定义的。
但是,鉴于 C++ 最终会编译为程序集,实际上是否定义了行为?
按位表示保持不变,整数格式保持不变 0111..11 将始终翻转到 1000..00,下溢也相同,那么为什么不将其视为已定义行为?
关于程序集编译,我是从我们在学校教过的基本程序集派生的,但是代码块给出了
int x = INT_MAX;
int y = x+1;
编译成
00401326 movl $0x7fffffff,0x8(%esp)
0040132E mov 0x8(%esp),%eax
00401332 inc %eax
00401333 mov %eax,0xc(%esp)
现在,不管 x 的值是多少,不会总是有 inc 或 add 指令吗?那么,未定义的行为是从哪里出现的呢?
【问题讨论】:
-
这个问题很有趣,但我认为您应该添加两种情况的 C++ 编码示例,以及编译器为每种情况生成的反汇编。
-
我必须同意@barakmanos
-
在 C++ 中是未定义的,因为世界上各种 CPU 没有就定义达成一致。例如,一些 CPU 使用“饱和”数学,溢出导致最大值。
-
它是为执行它的特定硬件定义的,但不是由 C++ 标准定义的。
-
如果编译器可以假设,某事是未定义的行为,这是出于某种原因。在大多数情况下,它是性能。编译器可以采用的假设越多,它可以生成的代码就越优化。而且您仍然可以对无符号整数执行“标准”操作。
标签: c++