【问题标题】:If sizeof(int) == sizeof(long), then is INT_MIN == LONG_MIN && INT_MAX == LONG_MAX always true?如果 sizeof(int) == sizeof(long),那么 INT_MIN == LONG_MIN && INT_MAX == LONG_MAX 是否总是正确的?
【发布时间】:2021-10-19 13:12:14
【问题描述】:

如果sizeof(int) == sizeof(long),那么INT_MIN == LONG_MIN && INT_MAX == LONG_MAX 是否总是正确的?

是否有任何真实存在的案例证明“不真实”?

UPD。类似问题:Is there any hosted C implementations which have CHAR_BIT > 8?.

【问题讨论】:

  • 可以想象一台计算机和一个疯狂的编译器编写器,它使用 2 的补码作为整数,使用符号大小作为长整数。但没有真实世界的例子。
  • 只是好奇,你为什么想知道你是否可以依赖它?
  • @stark 显然,在下一版本的 C 标准中,有符号整数的补码和符号和大小表示将被放弃。
  • The New C Standard 在第 594 页上说有 Cray 实现,其中 short 是占用 64 位空间的 32 位类型。在这种情况下,它可能有sizeof(short) == sizeof(int)SHORT_MAX < INT_MAX
  • 我认为这是对任何托管实现的安全假设,但这不是保证。 C 允许实现用类型大小和表示来做奇怪的事情,并且总是有一些奇怪的、利基架构必须以不同的方式做事。

标签: c integer range sizeof c11


【解决方案1】:

不一定是真的。 C11 6.2.6.2p2:

  1. 对于有符号整数类型,对象表示的位应分为三组:值位、填充位和符号位。不需要任何填充位; signed char 不应有任何填充位。应恰好有一个符号位。作为值位的每个位应与相应无符号类型的对象表示中的相同位具有相同的值(如果有符号类型中有 M 个值位,无符号类型中有 N 个值位,则 M

    • 符号位为0的对应值取反(符号和幅度);
    • 符号位的值为 -(2M)(二进制补码);
    • 符号位的值为 -(2M- 1)(反码)。

    这些应用中的哪一个是实现定义的,无论符号位为 1 且所有值位为零(对于前两个),还是符号位和所有值位为 1(对于一个补码)的值是陷阱表示或正常值。在符号和幅度以及反码的情况下,如果这种表示是正常值,则称为负零。


现在,问题是“是否有任何实现具有不同数量的填充位”,或者,即使是 stark mentioned,不同类型整数的不同表示 - 很难证明目前没有这样的实现正在使用。但我相信在现实生活中不太可能遇到这样的系统。

【讨论】:

    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 2013-09-24
    • 2010-11-09
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多