包括Microsoft在内的许多来源都将int和long类型引用为4字节,并且具有(signed) -2,147,483,648到2,147,483,647的范围。如果long原语类型实际上没有提供更大范围的值,那么它有什么意义呢?
发布于 2012-11-15 21:45:31
关于整数类型,唯一能保证的是:
sizeof(char) == 1 sizeof(char) <= sizeof(short) sizeof(short) <= sizeof(int) sizeof(int) <= sizeof(long)sizeof(long) <= sizeof(long long)sizeof(char) * CHAR_BIT >= 8sizeof(short) * CHAR_BIT >= 16 sizeof(int) * CHAR_BIT >= 16 sizeof(long) * CHAR_BIT >= 32sizeof(long long) * CHAR_BIT >= 64其他事情都是由实现定义的。
发布于 2012-11-15 21:42:15
C++标准只规定long至少和int一样大,所以当它完全一样大的时候,在场景中没有什么犯罪:它是完全由实现定义的。在不同的平台上,大小可能很重要,例如,在我的Linux机器上,我的int大小为4,long大小为8。
发布于 2012-11-15 22:00:36
正如其他人所指出的那样,这个问题背后的假设只是部分正确的,也就是说,在某些平台上并不成立。如果你真的想了解我们是如何走到现在的境地的,J·马希的the Long Road to 64 Bits将给你一个很好的视角,了解各种力量的存在以及它们是如何相互作用的。
快速总结,C从char (8位)和int (16位)开始。然后添加了short (16位)和long (32位),而int可以是16位或32位,这取决于平台上的自然特性和向后兼容的压力。当64位出现时,long long被添加为64位类型,并且在64位平台上对较小的类型进行了一些调整。32位int稳定了下来,但long保持了各种定义,一些64位平台有64位long,而另一些(可能只有Windows?)将long保持为32位,可能是由于向后兼容性的不同压力(Unix长期以来一直将long假定为与指针相同的大小,当int为16位时,Windows中的残留更多,因此long是唯一的32位类型)。顺便说一句,添加typedefs (intXX_t,intptr_t)是为了帮助使意图更清晰,但对于intXX_t家族来说,强制不变的大小是不真正需要的。
https://stackoverflow.com/questions/13398630
复制相似问题