C中数据类型的大小限制是如何确定的?
这个问题的答案说使用limits.h
作为数据类型的最小值和最大值。虽然有些人可能会停下来说好吧,好吧,但我在想:它怎么知道?如何设置limits.h
中的限制,以便您可以在任何计算机(任何环境(上使用相同的limits.h
?
显然,32 位机器的处理方式与 64 位机器不同。然后你就有了你的小端序与大端序的复杂性。它怎么知道(用简单的英语(?
首先,C标准设定了最低要求。 例如,int
必须足够大,至少可以容纳值 -32767 到 32767。但是该标准没有为编译器设置上限。
然后从那里,无论谁将编译器移植到给定的系统,都必须实现limits.h
(也stdint.h
(以适应给定系统的编译器。
传统上,int
的大小设置为 CPU 的数据总线宽度,或者更确切地说,设置为 CPU 在单个指令中可以处理的最大可能大小。但这不是必需的 - 对于 64 位 CPU,编译器将int
保留为 32 位,而是让long
或long long
为 64 位类型。
此外,签名格式也很重要。绝大多数现实世界的计算机都使用 2 的补码,因此 2 补码系统上 16 位类型的下限是 -32768 而不是 -32767 作为标准的最低要求。这是因为该标准接受其他一些非常奇特的符号格式。
然而,Endianess在这里不适用,因为这些标头只关注变量大小,而不涉及单个字节的寻址。