为何-LLONG_MIN会引发未定义行为?基于C11标准的推导问询
为何
-LLONG_MIN会引发未定义行为? 要搞清楚这个问题,我们从C11标准6.5.3.3p3条款出发逐步推导:
单目-运算符的结果是其(经提升的)操作数的负值,操作数会执行整数提升,结果为提升后的类型。
首先明确几个前提:
LLONG_MIN是long long类型能表示的最小有符号整数值,以常见的64位long long为例,它的值是-2^63。long long类型的可表示范围是[-2^63, 2^63 - 1],这个类型无法容纳2^63这个值。
接下来对应条款分析:
- 整数提升环节:
LLONG_MIN本身就是long long类型,且其精度高于int,因此整数提升后类型仍然是long long。 - 计算负值的要求:按照条款,
-LLONG_MIN的结果应该是LLONG_MIN的负值,也就是2^63,但这个值超出了long long类型的可表示范围。 - 未定义行为的触发:C标准规定,当有符号整数运算的结果超出其类型的可表示范围时,会产生未定义行为。这里的单目-运算属于有符号整数运算,结果无法被目标类型容纳,因此直接触发未定义行为。
另外需要注意,标准并没有要求单目-运算符通过「按位取反加1」的方式实现——但这并不是引发未定义行为的直接原因,核心还是运算结果超出了类型的可表示范围,和具体的实现方式无关。
内容的提问来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

