是否总是真的long int(这是我的理解是对的代名词long)是4个字节?
long int
long
4
我可以依靠吗?如果不是这样,那么对于基于POSIX的操作系统是否正确?
除了之外,标准没有关于任何整数类型的确切大小char。通常,long在32位系统上为32位,在64位系统上为64位。
char
但是,该标准并未指定 最小 尺寸。从C标准的 5.2.4.2.1节开始:
1 以下给出的值应被适合用于#if预处理指令的常量表达式代替。此外,除了CHAR_BIT和之外MB_LEN_MAX,以下内容应替换为与根据整数提升转换为相应类型的对象的表达式具有相同类型的表达式。 其实现定义的值的大小(绝对值)应等于或大于所示的相同符号。 … 类型对象的最小值 long int LONG_MIN -2147483647 //-(2 ^ 31-1) 类型对象的最大值 long int LONG_MAX +2147483647 // 2 ^ 31−1
1 以下给出的值应被适合用于#if预处理指令的常量表达式代替。此外,除了CHAR_BIT和之外MB_LEN_MAX,以下内容应替换为与根据整数提升转换为相应类型的对象的表达式具有相同类型的表达式。 其实现定义的值的大小(绝对值)应等于或大于所示的相同符号。
#if
CHAR_BIT
MB_LEN_MAX
…
LONG_MIN -2147483647 //-(2 ^ 31-1)
LONG_MIN
LONG_MAX +2147483647 // 2 ^ 31−1
LONG_MAX
这表示a long int 必须 至少为32位,但可能更大。在CHAR_BIT值为8 的机器上,它的最小字节大小为4。但是,在例如CHAR_BIT等于16的机器上,a long int可以为2个字节长。
这是一个真实的例子。对于以下代码:
#include <stdio.h> int main () { printf("sizeof(long) = %zu\n", sizeof(long)); return 0; }
在Debian 7 i686上的输出:
sizeof(long)= 4
在CentOS 7 x64上的输出:
sizeof(long)= 8
因此,您不能对大小做任何假设。如果需要特定大小的类型,可以使用中定义的类型stdint.h。它定义了以下类型:
stdint.h
int8_t
uint8_t
int16_t
uint16_t
int32_t
uint32_t
int64_t
uint64_t
所述stdint.h报头在标准的第7.20节中描述7.20.1.1,具有精确宽度的类型。该标准指出,这些typedef是可选的,但它们存在于大多数实现中。