INT_MIN从被视为未定义行为的任何整数中减去
Is INT_MIN subtracted from any integer considered undefined behavior?
如果我有这样的东西怎么办:
int a = 20;
int min = INT_MIN;
if(-a - min)
//do something
假设INT_MIN如果正数大于 INT_MAX.编译器是否会将 min 转换为类似 -min 的东西,如 -INT_MIN 中那样,这可能是未定义的?
您是对的,应用于INT_MIN
的一元减号可以未定义,但这在您的示例中不会发生。
-a - min
解析为 (-a) - min
。变量min
只涉及二进制减法,第一个操作数只需要严格为负数即可定义结果。
如果编译器将减法转换为其他内容,则其有责任确保新版本始终与旧版本计算相同的内容。
x - y
的结果定义为从x
中减去y
的数学结果。如果数学结果可以用结果类型表示(在本例中为int
),则没有溢出。
编译器可以自由地以它喜欢的任何方式转换表达式,例如通过更改
x - y
自
x + (-y)
但前提是转换在原始行为定义明确的情况下保持相同的行为。在y == INT_MIN
的情况下,只要评估-INT_MIN
的未定义行为产生相同的最终结果(它通常会这样做),它仍然可以执行转换。
要回答标题中的问题:
从任何整数中减去INT_MIN是否被视为未定义的行为?
INT_MIN - INT_MIN == 0
,并且不能溢出。
顺便说一句,我认为你的意思是int
而不是"整数"。 int
只是几种整数类型之一。
相关文章:
- C++模板函数,用于比较任何无符号整数和有符号整数
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- 如何在不给它任何类型(如整数)的情况下定义某物?
- 整数文本太大,无法用任何整数类型表示--C++
- boost::任何带有结构体和无符号整数
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 如何对 int 变量应用验证,使其仅接受整数数据,并且在任何其他数据的情况下不会出错?
- 你能在任何独立于架构的低级语言中获得更小的整数吗?
- 任何可以在单个 CPU 指令中在 0 和 1 之间翻转位/整数/布尔值的可能代码
- 为什么当用户输入除整数之外的任何内容时,我的程序会无限循环输出?C++
- 在比较两个字符串之前(整数)之前,将字符串转换为整数有任何好处
- 在C 中弹出任何元素后,会自动调整数组大小
- wchar_t保证与任何整数类型不同
- 如何检查输入是否是没有任何其他字符的有效整数
- 除 "6" 作为最右边数字的整数输入外,任何整数输入都可以使用,但任何数字(如 ...6.导致分段错误,为什么?
- 对于每个标量“T”,是否有任何保证存在相同大小的整数
- 如何仅将 16 位分配给二进制文件中的任何整数,而不是C++中的正常 32 位
- C++ 中任何基数中的整数文本
- 依靠任何数字类型(无符号、整数等)的隐式提升来加倍是否安全
- INT_MIN从被视为未定义行为的任何整数中减去