【发布时间】:2021-06-03 01:44:58
【问题描述】:
#include <limits.h>
int main(){
int a = UINT_MAX;
return 0;
}
我定义了这个 UB 或实现?
显示其 UB 的链接
https://www.gnu.org/software/autoconf/manual/autoconf-2.63/html_node/Integer-Overflow-Basics
Allowing signed integer overflows in C/C++
链接说明其实现已定义
转换规则说:
否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么引发实现定义的信号。
我们不是将max unsigned value 转换为signed value 吗?
我所看到的方式,gcc 只是截断了结果。
【问题讨论】:
-
你必须保持直接的conversion和overflow in expression。这里溢出发生在 converting
UINT_MAX为分配类型int。那是IDB。当在实际计算表达式时发生溢出时,如999999999*999999999,那就是UB。 -
我不明白吗?在这里,您还将
999999999*999999999的结果转换为 int 类型,这实际上会截断它。 -
C 不是这样定义的。执行
999999999*999999999未定义为“进行数学运算,然后根据通常的转换规则执行转换”。它被定义为“在概念上进行数学运算,但如果结果不能以int类型表示,则 UB”。转换规则永远不会发挥作用。 -
如果有助于理解,
long long int a = 999999999*999999999;也是 UB。只要评估了*运算符,UB 就会发生。您尝试对结果执行的操作无关紧要。
标签: c undefined-behavior implementation-defined-behavior