我在OSX上注意到了这一点,觉得很奇怪,因为我期望long比int更大。 是什么原因使它们的大小相同呢?
这是C和C ++语言规范中大小定义宽松性的结果。我相信C具有特定的最小大小,但在C ++中唯一的规则是:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
此外,sizeof(int)
和 sizeof(long)
在所有平台上的大小都不相同。在我使用过的每个64位平台上,long
都适合自然字长,因此在32位体系结构上为32位,在64位体系结构上为64位。
int
是最方便和高效的整数类型。long
是/曾经是最大的整数类型。short
是最小的整数类型。如果最长的整数类型也是最有效的,那么int
就与long
相同。在一段时间前(考虑到32位之前),由于16位是最宽的自然整数,因此在许多平台上sizeof(int) == sizeof(short)
。
正如Tom所指出的那样,C++中唯一的标准大小是char,其大小为1(*)。从此开始,类型之间只有'不小于'的关系。大多数人会声称它取决于架构,但这更多是编译器/操作系统的决定。在运行MacOSX、Windows(32/64位)或Linux(32/64位)的相同硬件上,相同数据类型的大小将不同。在相同架构和操作系统中,不同的编译器可能具有不同的大小。即使在相同的硬件、操作系统和编译器下,根据编译标志,大小也可能不同:
$ cat test.cpp
#include <iostream>
int main()
{
std::cout << "sizeof(int): " << sizeof(int) << std::endl;
std::cout << "sizeof(long): " << sizeof(long) << std::endl;
}
$ g++ -o test32 test.cpp; ./test32
sizeof(int): 4
sizeof(long): 4
$ g++ -o test64 test.cpp -m64; ./test64
sizeof(int): 4
sizeof(long): 8
sizeof(bool)==4
。int应该是体系结构的自然字长。在早期,像原始IBM PC这样的16位机器上,int是16位,long是32位。在像68000系列这样的32位机器上,int仍然是“自然字长”,现在是32位,而long保持在32位。随着时间的推移,long变为64位,然后我们开始使用像Intel Core 2这样的64位体系结构,所以我预计int迟早会增长到64位。
有趣的事实:在我的笔记本电脑上,使用Core 2 Duo和Mac OS X 10.5,int和long都是32位。在我的Linux桌面上,也使用Core 2 Duo和Ubuntu,int是32位,而long是64位。
多年前,在一次工作面试中,有人问我将3添加到int指针后,它会在哪里。我回答:“比现在大3倍sizeof(int)”。面试官追问我,我说这将取决于体系结构,因为(当时)Windows使用16位int,但由于我正在进行Unix编程,我更习惯于32位int。我没得到那份工作 - 我猜测面试官不喜欢我知道的比他多。
int
和long
的大小并不总是相同的,因此在代码中不要假设它们相同。历史上有8位和16位,以及更为常见的32位和64位架构。对于嵌入式系统来说,较小的字长仍然很常见。搜索网络以获取有关ILP32和LP64的过多信息。