对于我的一个C ++编程分配,我必须在设计程序时考虑整数变量的大小。我在互联网上阅读,大多数地方都说“整数的大小取决于平台。”我不清楚这意味着什么,所以我在这里问。
什么决定了原始数据类型的大小?
在某些系统中选择整数的大小为2 byte
s,在其他系统中选择4 byte
s的原因是什么?有什么理由不能继续2字节吗?
答案 0 :(得分:6)
他们在这里意味着什么平台。
通常,它表示操作系统,编译器和编译器的一些特殊选项的组合。
决定原始数据类型大小的原因。
这将是以上的组合。'
顺便说一句,这被称为“记忆模型”。或者'数据模型' (不确定哪一个是正确的术语),您可以从http://en.wikipedia.org/wiki/64-bit
了解更多信息答案 1 :(得分:5)
什么决定了原始数据类型的大小?
这取决于编译器。编译器通常依赖于体系结构,处理器,开发环境等,因为它将它们考虑在内。所以你可以说它是所有的组合。
在某些系统中选择整数大小为2个字节的原因是什么,在其他系统中选择4个字节?是否有任何理由不再继续使用2个字节?
C ++标准没有以字节为单位指定整数类型的大小,但它指定了它们必须能够容纳的最小范围。您可以从所需范围推断出最小位数。您可以从中推断出最小大小(以字节为单位)以及CHAR_BIT
宏defines the number of bits in a byte的值(除了最简陋的平台之外的所有平台#8},它可以更少比8)。
查看here了解详情。
答案 2 :(得分:1)
看来你的第一个问题已经得到了回答,所以我会对第二个问题进行一次尝试:
在某些系统中选择整数大小为2个字节的原因是什么,在其他系统中选择4个字节?是否有任何理由不再继续使用2个字节?
这归结为架构(或编译器等)的设计者的意见。通常,内存地址表示为unsigned integer
数据类型。因此,您可以获得integer
大小的有趣历史记录,这些大小反映了操作系统中地址的大小。也就是说,这真的不是巧合:
cout << "Unsigned short: " << sizeof(unsigned short) << endl;
cout << "Unsigned int: " << sizeof(unsigned int) << endl;
cout << "Unsigned long: " << sizeof(unsigned long) << endl;
在大多数系统上生成以下输出:
Unsigned short: 2
Unsigned int: 4
Unsigned long: 8
因为一个字节是8位,所以你得到以下大小:
你可以打赌,如果我们进入128位操作系统,会有一个由16个字节组成的数据类型(可能是unsigned long long
?)。
从某种意义上说它是历史,但为什么建筑师会决定从这些尺寸开始? 原因如下:
integer
数据类型都可能是浪费的,因为人们根本不需要用原始数据来计算那么高的数据类型。integer
完全适合单个寄存器,因此大小通常受硬件限制(寄存器只是一个示例)。我确信有更智能,更有经验的StackOverflow成员可以提供的其他原因: - )
答案 3 :(得分:1)
在C中,int的大小是gcc(编译器的GNU集合)中的4个字节,以及borland和turbo c编译器中的2个字节。最后两个编译器特定于windows,而gcc编译器是Linux OS的编译器。 原始数据类型的大小基于编译器,这些编译器基本上特定于特定的OS。我个人更喜欢gcc编译器而不是其他编译器,因为它根据C语言的定义支持许多功能。其中一个例子是空指针。如果你在gcc中声明一个空指针并尝试在gcc中访问它,它会给你错误,但turbo c允许使用它没有错误。