是否总是真的long int
(这是我的理解是对的代名词long
)是4
个字节?
我可以依靠吗?如果不是,那么对于基于POSIX的操作系统来说是否正确?
是否总是真的long int
(这是我的理解是对的代名词long
)是4
个字节?
我可以依靠吗?如果不是,那么对于基于POSIX的操作系统来说是否正确?
long
的定义中带有s,但是它们不必是64位的。因此,MS决定使用long
32位,以使其结构在ABI和现有代码库中保持相同的大小。
Answers:
除了之外,标准没有关于任何整数类型的确切大小char
。通常,long
在32位系统上为32位,在64位系统上为64位。
但是,该标准并未指定最小尺寸。从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
这表示along int
必须至少为32位,但可能更大。在CHAR_BIT
值为8的机器上,它的最小字节大小为4。但是,在例如CHAR_BIT
等于16的机器上,along 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
。它定义了以下类型:
int8_t
:签名的8位uint8_t
:无符号8位int16_t
:有符号16位uint16_t
:无符号16位int32_t
:签名的32位uint32_t
:无符号32位int64_t
:签名的64位uint64_t
:无符号64位所述stdint.h
报头在标准的第7.20节中描述7.20.1.1,具有精确宽度的类型。该标准指出这些typedef是可选的,但它们存在于大多数实现中。
1 == sizeof(char) == sizeof(int)
。您能提供标准中的“int
至少2个字节”的报价吗?
char
可以大于8位。当然,拥有32位(sizeof
当然仍然是1位)会使处理8位文本编码这样的数据变得很痛苦,但通常不会将类似的平台用于文本处理。
long
通常是64位的,因为它不在Windows上,并且Windows被广泛使用。当然,标准本身并未对此进行定义,因此这两种实现都符合标准,但是最终结果是大量的unix C(和C ++)代码在Windows上截断了64位指针(只是停止将指针存储为整数) ,该死!当然,从根本上讲,这是由于使用标准范围为[−2147483647,+2147483647]的类型来存储大于该值的类型而造成的,这有点荒谬,但是好吧:)
不,C标准和POSIX都不能保证这一点,事实上,大多数类似Unix的64位平台都具有64位(8字节)long
。
使用代码sizeof(long int)
并检查大小。它会为您提供当前正在使用的系统上long int的大小(以字节为单位)。您的问题的答案尤其是“否”。在C,POSIX或任何地方都无法保证。
sizeof(long int)
将填充和对齐限制因素纳入其结果。sizeof
即使只允许使用其中四个字节,返回“ 16”也是完全有效的。
正如@delnan所指出的那样,POSIX实现会保留的大小long
和int
未指定的大小,并且在32位和64位系统之间通常有所不同。
其长度long
主要与硬件有关(通常与CPU上数据寄存器的大小匹配,有时与其他软件相关的问题(例如OS设计和ABI接口)匹配)。
为了简化您的想法,sizeof
它不是函数,而是编译器指令*,因此您的代码在使用时不使用操作sizeof
-它与编写数字相同,只是可移植。
采用:
sizeof(long int)
*正如Dave在注释中指出的那样,sizeof
当无法在编译过程中计算值时(例如,使用可变长度数组时),将在运行时进行计算。
另外,正如另一条评论中指出的那样,sizeof
考虑到实现所使用的填充和对齐方式,这意味着使用的实际字节可能与内存中的大小不同(这在移位时很重要)。
如果要查找特定的字节大小的变量,请考虑使用字节数组或(我假设会支持)由C99 stdint.h
in-定义的类型,如@dbush所建议。
usually
为mostly
并在括号中添加信息来阐明这一点。
sizeof
是一个编译器指令,以消除任何人可能会猜到的大小的可感知原因。
sizeof
在(如果使用)在C99或更高版本中使用可变长度数组或可变修改的类型(或“ gnu89”作为GCC扩展名)时,在运行时进行计算,但大多数代码不这样做。
当我们首次在ICL Series 39硬件上实现C时,我们一字不漏地使用了标准,并将数据类型映射到该计算机体系结构上的自然表示形式,即short
32位int
= 64位long
= 128位。
但是我们发现没有任何认真的C应用程序可以工作。他们都假定映射short
= 16 int
= 32 long
= 64,我们必须更改编译器以支持该映射。
因此,不管官方标准说什么,多年来,每个人都汇聚了long
= 64位,并且这种可能性不太可能改变。
该标准没有说明的大小long int
,因此它取决于您使用的环境。
要获取long int
您环境中的大小,可以使用sizeof
运算符并获取的大小long int
。就像是
sizeof(long int)
C标准仅要求有关类型大小的以下几点
- int> = 16位,
- 长于== 32位,
- long long(因为C99)> = 64位
- sizeof(char)<= sizeof(short)<= sizeof(int)<= sizeof(long)<= sizeof(long long)
- sizeof(char)== 1
- CHAR_BIT> = 8
剩下的是定义的实现,因此如果遇到某些系统具有int有18/24/36/60位,一个补码形式的系统,sizeof(char)== sizeof(short)== sizeof(int)== sizeof(long)== 4、48位长或9位char,类似于标准委员会关注的Exotic体系结构以及C标准支持的平台列表
关于上面的long int的观点是完全错误的。大多数Linux / Unix实现将长定义为64位类型,但在Windows中只有32位,因为它们使用不同的数据模型(请参见此处的表64位计算),而无论32位还是64位操作系统版本。
编译器根据硬件和操作系统的类型确定大小。
因此,不应对大小进行假设。
不,您不能假设由于“长”数据类型的大小因编译器而异。
看看这个文章的更多细节。
sizeof
注意填充和对齐方式。它具有sizeof(unsigned long)
8个字节的标准格式,但溢出的行为类似于4个字节。尝试使用sizeof
和CHAR_BITS
计算整数类型的限制是错误的方式。使用limits.h
时应使用。