为什么“long int”与“int”具有相同的大小? 这个修饰符是否有效?
嗯..我很喜欢这样的修饰符,如长 / 短扩展/减少创建变量时分配的内存量,但是……
#include #define test_int int #define long_int long int #define long_long_int long long int void main() { printf("%i\n", sizeof (test_int)); //output 4 printf("%i\n", sizeof (long_int)); //output 4. Why? wasn't I modified it's size? printf("%i\n", sizeof (long_long_int)); //output 8 }
由于未知原因,它将int和long int的大小打印为相同。 我使用的是vc ++ 2010 express版。 对不起,很难在谷歌找到答案,它总是显示长和int作为单独的类型。
即使在64位系统上,MS选择long
32位的原因在于,由于历史原因,现有的Windows API使用int
和long
的混合类似的东西,并且期望这是32位值(其中一些可以追溯到Windows是16位系统的时候)。 因此,为了将旧代码转换为新的64位体系结构,他们选择long
保持32位,以便在各个位置混合int
和long
应用程序仍然可以编译。
C ++标准中没有任何内容规定long
应该大于int
(当然不是大多数32位系统)。 所有标准都说short
的大小<= int
<= long
– 而且这个short
至少是16位,如果内存服务[不一定表示为“应该至少16位”,我认为它提到的范围值。
标准要求的是:
sizeof(char) == 1
和
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
(并且相应的无符号类型与签名类型具有相同的大小)。
此外,每种类型都有最小大小,由INT_MAX
等的值限制间接指定: char
必须至少为8位, short
和int
16, long
32和long long
64。
在16位平台上, short
和int
通常都是16位; 在32位平台(以及仍然存在的36位和48位平台)上, int
和long
几乎总是相同的大小。 在现代64位平台(带字节寻址)上,合理的解决方案是使所有四种类型具有不同的大小(尽管可以说根据标准, int
应该是64位,这意味着int
, long
和long long
都有相同的大小)。
C和C ++实现,long大于或等于int。 今天最流行的桌面平台,如Windows和Linux,主要运行在32位处理器上,大多数这些平台的编译器使用32位int,它具有相同的大小和表示forms。
在64位编译器中,int和log int都是4个字节。
如果你在Windows中,请通过以下链接: http : //msdn.microsoft.com/en-us/library/s3f49ktz%28v=vs.90%29.aspx
您可以在另一个讨论中找到一些信息: 64位Windows上的长位是多少?
这是订购
char short (int) int long (int) long long (int)
该标准要求sizeof(char) == 1
为真。 该标准还要求: int
至少为16位。 long int
至少为32位, long long int
至少为64位。
由于32位处理器是maintstream,编译器通常将int
设置为4个字节。 为了兼容性,在64位系统(无论如何为MSVC)上没有再次发生扩展。
关键是你误解了int和long的含义(这不是形容词)。
标准定义的是每种类型的比特数要求这种关系保持不变:
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long).
int
,就其自身而言,可以长达一段long
取决于实现的构思方式。
编译器设计者倾向于最大化int
算法的性能,使其成为底层处理器或OS的自然大小,并相应地设置其他类型。
但是使用long int
,因为int
可以省略,它只是定义为long
。