在64位机器上,int的大小应该是多少?

87

可能是重复问题:
int,long等变量的大小
int的大小是否取决于编译器和/或处理器?
什么决定了整数的sizeof?

我使用的是64位机器。

$ uname -m
x86_64
$ file /usr/bin/file
/usr/bin/file: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
$ 

当我运行以下程序时,我得到了sizeof(int)4字节

#include <stdio.h>

int main(void)
{
    printf("sizeof(int) = %d bytes\n", (int) sizeof(int));

    return 0;
}
如果我正在运行一台 16-32-64-bit 的计算机,那么这是否意味着 integer 的大小分别为 16-32-64-bit
在我的计算机上,我发现 WORD_BIT32。在一个 64-bit 的机器上它不应该是 64 吗?
$ getconf WORD_BIT
32
$ 

此外,在上述情况下,sizeof(int)不应该是64位8字节)吗?


4
我不是C语言专家,但我认为除了“char”以外的任何类型大小都是由编译器决定的,并且它也不一定等于处理器中一个字的大小。 - Ry-
https://dev59.com/TXRB5IYBdhLWcg3wj32c - Perception
1
@minitech:char类型也是编译器特定的。 - Daniel
19
“sizeof(char)”根据定义始终为1。 “char”是由“sizeof”返回的隐含单位。 - Matt K
2
说“这是一台64位机器”的丑陋之处在于:64位什么?64位数据总线?地址总线?整型寄存器? - Matt K
显示剩余2条评论
4个回答

79

在任何64位的C/C++编译器中,指针的大小应为8个字节,但int类型的大小并非一定如此。


14
这是一个重要的观察结果。在32位架构中,指针宽度为32位,这意味着它们无法寻址超过4GB的内存。 - c0dehunter
什么是 64 位编译器的定义?如果地址空间限制为 4GB,则 32 位指针将运行良好。 - XTF
2
@XTF 对,而且 x32 是一个真实存在的东西:它是一种用于 64 位 CPU 的架构,但使用 32 位指针、intlong 类型。更多详情请参考:https://wiki.debian.org/X32Port - underscore_d
@underscore_d:我想知道为什么x32模式不常用?许多程序甚至从未接近使用一千兆字节的内存,对于这样的程序来说,使用64位指针似乎是纯粹的浪费。 - supercat

65

不一定是64位机器,这个术语可以有很多含义,但通常意味着CPU具有相应的寄存器。类型的大小由编译器决定,它与实际硬件没有必然联系(尽管通常会有),实际上,在同一台机器上的不同编译器可能具有不同的值。


编译器将根据什么依据确定? - Kirubakaran
编译器将根据什么基准来确定? - undefined
你得问编译器的作者。 - Scott Hunter
你得问编译器的作者。 - undefined

35

不完全是这样,出于向后兼容性考虑,它是32位的。
如果你需要64位,你可以使用 longsize_t 或者 int64_t


22
在 Windows 64 位系统中,long 占用 4 个字节。 - Jonathan Leffler
11
64位Windows有什么异常?Linux和Windows选择为它们的64位实现实施不同的数据模型,这并不能证明哪个更正常。 - Praetorian
2
@Prætorian:long 仍然是32位的事实。 - Jonathan Leffler
12
这不准确。在这两者之间,Linux拥有一种被选择的模型。而Windows的模型则受到向后兼容的负累积影响,可能追溯到Windows 3甚至更早时期。 - Kaz
5
@Kaz: 尽管 Windows 7(更不用说 Windows 8)并非所有的 Windows 98/XP 程序都能在其上无需兼容性修改运行,即使使用兼容性 hack,有些程序仍然无法正常运行。因此,向后兼容 16 位 Windows 简直是一个笑话。这没有任何_真正_的理由。如果问我,他们应该在 Win 7 中放弃任何比某个阈值旧的东西(因为大多数旧软件无论如何都无法正常工作)。可惜,这并没有发生 :( - Damon
显示剩余2条评论

12

在C++中,int的大小没有被明确地指定。它只是告诉你它必须至少与short int的大小一样,而后者的大小必须至少与signed char一样大。 char的位数大小也没有被明确地指定,虽然sizeof(char)被定义为 1。如果您想要一个64位的int,C++11将long long指定为至少64位。


1
char 的大小没有明确指定是误导性的。sizeof(char) 根据定义是 1(所以 char 是一个字节)。唯一变化的“大小”是它使用的位数:CHAR_BITS,至少为 8。还要注意一个字节可以有多于 8 个位。 - Anthales
1
你需要查找关于 sizeof 运算符的语义。由于我没有 C++ 标准文档,所以我只能告诉你 C99 对此的看法(我知道 C++ 也同意这一点):“sizeof 运算符返回其操作数的大小(以字节为单位)。”和“当应用于具有类型 charunsigned charsigned char(或其限定版本)的操作数时,结果为 1”。 - Anthales
1
@Anthales,你说得完全正确,C++11标准的§5.3.3。感谢你指出这一点。 - juanchopanza
1
是的,这是其中一件事情,要么必须事先知道,要么最终会在阅读标准时偶然发现。除了没有人真正想去阅读标准。 ;) - Anthales
在这里说 char 是一个字节其实是没有多大意义的,因为一个字节是一种实现定义的位数,而不是被认为的八位组。这更多地是一个向后的定义,并且更多地定义了字符应该是系统定义字节大小的任何尺寸。 - Vality
@Vality 是的,但那就是定义。无论在任何特定平台上使用多少位,char 的大小都是1。 - juanchopanza

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