【问题标题】:Does the C standard make an guarantees about the relationship between INT_MIN and INT_MAX?C 标准是否对 INT_MIN 和 INT_MAX 之间的关系做出保证?
【发布时间】:2014-03-05 00:40:14
【问题描述】:

例如,在 2 和 1 的补码中,INT_MAX*-1 都是有效数字。这是有保证的吗?还有其他保证吗?例如,在任何架构上 INT_MIN 可以是 -1 还是 0?关于 (INT_MAX + INT_MIN) 有什么我们可以知道的吗?我们甚至可以知道 (INT_MAX + INT_MIN) 不会导致未定义的行为吗?

【问题讨论】:

  • 由于最小值和最大值的符号相反(见附件 E),它们的总和必须是可表示的。附件 E 还说INT_MIN 不能是 -1,因为它最多只能是 -32767。
  • INT_MIN 必须小于或等于 -32767。所以不,它不能是 -1 或 0。

标签: c standards signed integer-overflow


【解决方案1】:

INT_MAX + INT_MIN 总是被定义,因为添加两个相反符号的数字永远不会溢出。

为了尽可能准确地回答您的问题,C 标准要求 2 的补码、1 的补码或符号幅度表示。 (C11 6.2.6.2:2)。 int 类型可能有填充位,但符号位和值位在任何情况下都用于表示对称或几乎对称的数字集。一个总是有INT_MIN == - INT_MAX - 1INT_MIN == - INT_MAX,这取决于平台是否使用2 的补码。

当然INT_MAX 至少是 32767,对应于值和符号位的至少 16 位。

【讨论】:

    【解决方案2】:

    C 规范要求 INT_MIN 为 -32767 或更小,INT_MAX 为 32767 或更大。据我所知,没有进一步的保证。第 22 页:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

    【讨论】:

      【解决方案3】:

      保证 INT_MIN 最多为 -32767,INT_MAX 至少为 32767。

      所以 INT_MAX-1 始终是有效的 int。

      INT_MAX + INT_MIN 也总是被定义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-03
        • 2014-11-26
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 2017-07-06
        • 2020-03-28
        相关资源
        最近更新 更多