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

8
如果 sizeof(int) == sizeof(long),那么 INT_MIN == LONG_MIN && INT_MAX == LONG_MAX 是否总是成立?
是否存在任何真实的情况证明“不正确”?
更新:类似的问题:是否有CHAR_BIT> 8的主机C实现?

1
可以想象一台计算机和一个疯狂的编译器编写者,使用2的补码来表示整数,使用符号-大小法来表示长整数。但是现实世界中并没有这样的例子。 - stark
1
只是好奇,你为什么想知道你是否可以依赖那个? - Stefan Riedel
1
@stark 显然,C标准的下一个版本将放弃使用有符号整数的补码和原码表示方法。 - Ian Abbott
6
《新C标准》第594页指出,在Cray计算机上有些实现中,short类型是占用了64位空间的32位类型。在这种情况下,short类型可能会满足sizeof(short) == sizeof(int)SHORT_MAX < INT_MAX - Nate Eldredge
我认为在任何托管实现中都可以安全地做出这种假设,但这并不是保证。C 允许实现在类型大小和表示方面进行奇怪的操作,而且总会有一些奇特的、小众的架构需要以不同的方式处理事情。 - John Bode
@NateEldredge 想知道有多少“超级计算机实现”仍在使用中... - Antti Haapala -- Слава Україні
1个回答

6

它不一定是真的。C11 6.2.6.2p2

对于带符号整数类型,对象表示的位应该被分成三组:值位、填充位和符号位。不需要有填充位;signed char 不应该有任何填充位。应该只有一个符号位。每个值位都应该与相应无符号类型的对象表示中的相同位具有相同的值(如果 signed 类型中有 M 个值位,unsigned 类型中有 N 个,则 M <= N)。如果符号位为零,则不会影响结果值。如果符号位为一,则值将按以下方式之一进行修改: - 具有符号位 0 的相应值被取反(符号幅度); - 符号位的值为 -(2^M)(二进制补码); - 符号位的值为 -(2^M - 1)(反码)。 这些适用哪一个是实现定义的,以及具有符号位 1 和所有值位为零(对于前两个)或具有符号位和所有值位为 1(对于反码)的值是陷阱表示还是正常值也是实现定义的。在符号幅度和反码的情况下,如果此表示是正常值,则称其为负零。
现在的问题是,“是否有不同数量填充位的实现”,或者如stark提到,不同类型整数的不同表示方式 - 很难证明当前没有使用这样的实现。但我相信在现实生活中很少会遇到这样的系统。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接