为什么
-LLONG_MIN
会导致未定义的行为?
C11,6.5.3.3p3:
一元 - 运算符的结果是其(提升的)操作数的负数。整数 对操作数执行提升,结果具有提升后的类型。
这里我们看到C标准并没有说必须实现一元-运算符,例如使用bitwise-not后面加1,其中“加1”可能会导致未定义的行为。
如何从引用的文本中推断出
-LLONG_MIN
会导致未定义的行为?
如何从引用的文本中推断出 -LLONG_MIN 会导致未定义的行为?
无法从引用的文本中推断出它。您还需要此文本https://port70.net/~nsz/c/c11/n1570.html#6.5p5:
如果在计算表达式期间出现异常情况(即,如果结果未在数学上定义或不在其类型的可表示值范围内),则行为未定义。
在
-LLONG_MIN
的数学结果无法以long long
类型表示的实现中,会触发此规则并且行为未定义。
如何从引用的文本中推断出
会导致未定义的行为?-LLONG_MIN
仅从引用的文字中无法推断出这一点。然而,这一连串的推理就足够了:
LLONG_MIN
为 -9,223,372,036,854,775,808,而 LLONG_MAX
为 9,223,372,036,854,775,807 (C 2018 5.2.4.2.1 1)。LLONG_MIN
为 −9,223,372,036,854,775,808,LLONG_MAX
为 9,223,372,036,854,775,807。 (这需要额外的推理或接受我不会深入研究的命题,包括:这是补码算术的属性,并且 C 标准是自洽的。)-LLONG_MIN
的指定结果将是 9,223,372,036,854,775,808。如果在计算表达式期间出现异常情况(即,如果结果未在数学上定义或不在其类型的可表示值范围内),则行为未定义。