为什么 -LLONG_MIN 会导致未定义的行为?

问题描述 投票:0回答:2

为什么

-LLONG_MIN
会导致未定义的行为?

C11,6.5.3.3p3:

一元 - 运算符的结果是其(提升的)操作数的负数。整数 对操作数执行提升,结果具有提升后的类型。

这里我们看到C标准并没有说必须实现一元-运算符,例如使用bitwise-not后面加1,其中“加1”可能会导致未定义的行为。

如何从引用的文本中推断出

-LLONG_MIN
会导致未定义的行为?

c language-lawyer undefined-behavior integer-overflow negation
2个回答
0
投票

如何从引用的文本中推断出 -LLONG_MIN 会导致未定义的行为?

无法从引用的文本中推断出它。您还需要此文本https://port70.net/~nsz/c/c11/n1570.html#6.5p5

如果在计算表达式期间出现异常情况(即,如果结果未在数学上定义或不在其类型的可表示值范围内),则行为未定义。

-LLONG_MIN
的数学结果无法以
long long
类型表示的实现中,会触发此规则并且行为未定义。


0
投票

如何从引用的文本中推断出

-LLONG_MIN
会导致未定义的行为?

仅从引用的文字中无法推断出这一点。然而,这一连串的推理就足够了:

  • C 标准允许
    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)。
  • 存在(在数学意义上)一个 C 实现,其中
    LLONG_MIN
    为 −9,223,372,036,854,775,808,
    LLONG_MAX
    为 9,223,372,036,854,775,807。 (这需要额外的推理或接受我不会深入研究的命题,包括:这是补码算术的属性,并且 C 标准是自洽的。)
  • 在这样的 C 实现中,
    -LLONG_MIN
    的指定结果将是 9,223,372,036,854,775,808。
  • 在所述 C 实现中,该值无法表示。
  • C 6.5 5 说:

如果在计算表达式期间出现异常情况(即,如果结果未在数学上定义或不在其类型的可表示值范围内),则行为未定义。

© www.soinside.com 2019 - 2024. All rights reserved.