gpt4 book ai didi

c++ - 为什么 C++ 下溢/溢出行为被视为未定义?

转载 作者:可可西里 更新时间:2023-11-01 18:26:21 24 4
gpt4 key购买 nike

我知道整数下溢和上溢是未定义的。

但是,考虑到 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 指令吗?那么,未定义的行为是从哪里产生的呢?

最佳答案

However, given that C++ eventually compiles to assembly, isnt the behavior actually defined?

不,因为编译器决定它发出什么样的程序集。如果编译器愿意,它可以生成程序集,在遇到未定义的行为时删除您的硬盘。

(实际上,“C++ 最终编译成程序集”甚至可能不是真的。存在 C++ interpreters, for example - 标准没有指定 C++ 应该如何编译/编译成什么格式。

标准的创建者决定保留它未定义的原因之一是——几乎总是——优化的机会。例如,如果有符号溢出是 UB,则编译器可以假设 x + 1 > x 始终为真,并生成依赖于此前提条件的更简单/更短/更快的代码。

关于c++ - 为什么 C++ 下溢/溢出行为被视为未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26956729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com