作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我知道整数下溢和上溢是未定义的。
但是,考虑到 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/
我是一名优秀的程序员,十分优秀!