What should be the sizeof(int) on a 64-bit machine?
Possible Duplicate:
size of int, long, etc
Does the size of an int depend on the compiler and/or processor?
What decides the sizeof an integer?
我在用一台64-bit机器。
1 2 3 4 5
| $ 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-bytes。
1 2 3 4 5 6 7 8 9
| #include <stdio.h>
int main(void)
{
printf("sizeof(int) = %d bytes
", (int) sizeof(int));
return 0;
} |
如果我运行的是16-、32-和64-位机,那么这不意味着integer的大小分别是16-、32-和64-位吗?
在我的机器里,我发现WORD_BIT是32。难道不是64-bit机器上的64吗?
1 2 3
| $ getconf WORD_BIT
32
$ |
在上述情况下,sizeof(int)不应该是64-bits(8 bytes吗?
- 型我不是一个C语言的人,但我相信除char以外的任何东西的大小都是特定于编译器的,也不一定是处理器上一个字的大小。
- 型stackoverflow.com/questions/589575/size-of-int-long-等等
- 型@minitech:char也是特定于编译器的
- 型因为4个字节适合8个字节,所以不推翻horscart并假设常规int可以存储比它可以存储更多的内容是明智的,尤其是对于互操作性。
- 型根据定义,sizeof(char)总是1。char是sizeof返回的隐含单位。
- 型说"这是64位机器"的丑陋之处是:64位是什么?64位数据总线?地址总线?整数寄存器?
- 型@mkb:64位ALU大小。64位上的其他所有内容实际上不是64位
在任何64位C/C++编译器上,指针的大小应该是8字节,但不一定是int大小。
- 这是一个重要的观察。32位体系结构上的指针是32位宽的,这意味着它们不能寻址超过4GB的内存。
- 64B编译器的定义是什么?如果地址空间限制为4GB 32B指针,则可以正常工作。
- @XTF是正确的,而x32是一个真正存在的东西:一个64位CPU的体系结构,但是有32位指针,ints和longs:wiki.debian.org/x32port
- @强调:我想知道为什么x32不经常被用作模型?许多程序甚至从来没有接近使用一个gig内存,在这样的程序中使用64位指针似乎是纯粹的浪费。
不必是,"64位机器"可能意味着很多事情,但通常意味着CPU有那么大的寄存器。类型的大小是由编译器决定的,它与实际的硬件没有任何关系(尽管它通常是这样);事实上,同一台机器上的不同编译器可以有不同的值。
不是真的。为了向后兼容,它是32位。如果你想要64位,你有long、size_t或int64_t。
- 在Windows64上,long是4个字节。
- @Dani 64位Windows有什么异常?Linux和Windows选择为64位的实现实现实现不同的数据模型,这并没有使一个模型比另一个更正常。
- @pr&230;Torian:long仍然是32位的事实。
- 这不准确。在这两者中,Linux有一个被选择的模型。Windows的模型是由向后兼容cruft决定的,如果不是更多的话,可能会返回到Windows3。
- @卡兹:尽管大多数Windows 98/XP程序都不能在Windows 7下工作(我们甚至不必考虑Windows 8),但如果没有兼容性黑客,甚至有些程序也不能。目前为止,向后兼容到16位Windows确实是个笑话。这没有真正的原因。如果你问我的话,他们应该把任何比7号胜利的门槛更高的东西扔到海里(因为大部分都不能正常工作)。唉,那不是发生的:(
- @达蒙,你的想法不像有商业客户的人。他们有一些非常重要的项目,这将是非常昂贵的港口,并将支持他们只要他们有足够的钱这样做-到时间结束,如果需要的话。如果他们不付钱,他们就不在乎"大多数"项目;)
- @弗朗西斯科多迪:哦,我的想法和有商业客户的人一模一样。在某种程度上,是时候告诉他们:"看,这个25岁的狗屎应该换成有用的东西。"维护史前软件和生活在它的怪癖很快超过了一个适当的解决方案在成本上(当然,因为作为维护者,你要为此付出代价,做得更好并不符合你的利益!)请注意,我们仍然是截至2017年的Base-64编码电子邮件附件,假设存在不能正确转发8位字节的调制解调器。我的意思是…变得真实。
在C++中,没有明确指定EDCOX1×3Ω的大小。它只是告诉你它必须至少是short int的大小,它必须至少和signed char一样大。虽然size of(char)被定义为1,但也没有明确指定以位为单位的char的大小。如果你想要一个64位的int,C++ 11指定EDCOX1×7Ω至少是64位。
- 说char的大小没有明确规定是误导性的。根据定义,sizeof(char)是1(因此char是一个字节)。唯一不同的"大小"是它使用的位数:CHAR_BITS,它至少是8。另请注意,一个字节可以有8位以上。
- 您需要查找关于sizeof运算符的语义。因为我没有C++标准文档,所以我只能告诉你C99有什么要说的(我知道C++在这点上是一致的):"EDOCX1×5×操作符产生它的操作数的大小(以字节为单位)。"和"当应用于一个操作类型,它具有EDCOX1类型2,EDCOX1,8,或EDCOX1,9,(或它的一个合格版本),结果是1。
- Anthales,你完全正确,在C++ 11标准中,167。谢谢你指出这一点。
- 是的,这是其中之一,要么你必须事先知道,要么你最终偶然发现,阅读标准。除了没有人真的想读这个标准。;)
- 在这里说char是一个字节是毫无意义的,但是因为一个字节是一个实现定义的位数,而不是假定的八位字节。这更像是一个向后的定义,更像是定义一个字符应该是系统定义一个字节的任何大小。
- @勇敢是的,但这就是定义。char的大小为1,与任何特定平台上使用的位数无关。