如果 sizeof(int) == sizeof(long),那么 INT_MIN == LONG_MIN && INT_MAX == LONG_MAX 总是 true 吗?

Pav*_*kin 8 c integer range sizeof c11

如果sizeof(int) == sizeof(long),则INT_MIN == LONG_MIN && INT_MAX == LONG_MAX始终为真?

有没有真实存在的案例证明“不真实”?

UPD。类似的问题:是否有 CHAR_BIT > 8 的托管 C 实现?

Ant*_*ala 6

这不一定是真的。C11 6.2.6.2p2

  1. 对于有符号整数类型,对象表示的位应分为三组:值位、填充位和符号位。不需要任何填充位;signed char 不应有任何填充位。应只有一个符号位。作为值位的每个位应与相应无符号类型的对象表示中的相同位具有相同的值(如果有符号类型中有 M 个值位,无符号类型中有 N 个值位,则 M <= N )。如果符号位为零,则不会影响结果值。如果符号位为1,则应通过以下方式之一修改该值:

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

    其中哪一个适用是实现定义的,就像符号位为 1 且所有值位为零(对于前两个)的值,还是符号位和所有值位为 1(对于补码)的值是否是陷阱表示或正常值。在符号和大小以及补码的情况下,如果该表示是正常值,则称为负零。


现在的问题是“是否存在具有不同数量的填充位的实现”,或者即使正如明确提到的那样,不同类型的整数有不同的表示形式 - 很难证明当前没有这样的实现正在使用。但我相信人们在现实生活中不太可能遇到这样的系统。