是什么决定了原始数据类型的大小?

时间:2014-03-20 03:26:48

标签: c++ c memory types

对于我的一个C ++编程分配,我必须在设计程序时考虑整数变量的大小。我在互联网上阅读,大多数地方都说“整数的大小取决于平台。”我不清楚这意味着什么,所以我在这里问。

  1. 什么决定了原始数据类型的大小?

    • 处理器架构(可能是指令集大小)。
    • 操作系统
    • 编译器
    • 上述组合。
  2. 在某些系统中选择整数的大小为2 byte s,在其他系统中选择4 byte s的原因是什么?有什么理由不能继续2字节吗?

4 个答案:

答案 0 :(得分:6)

  

他们在这里意味着什么平台。

通常,它表示操作系统,编译器和编译器的一些特殊选项的组合。

  

决定原始数据类型大小的原因。

这将是以上的组合。'


顺便说一句,这被称为“记忆模型”。或者'数据模型' (不确定哪一个是正确的术语),您可以从http://en.wikipedia.org/wiki/64-bit

了解更多信息

答案 1 :(得分:5)

  

什么决定了原始数据类型的大小?

这取决于编译器。编译器通常依赖于体系结构,处理器,开发环境等,因为它将它们考虑在内。所以你可以说它是所有的组合。

  

在某些系统中选择整数大小为2个字节的原因是什么,在其他系统中选择4个字节?是否有任何理由不再继续使用2个字节?

C ++标准没有以字节为单位指定整数类型的大小,但它指定了它们必须能够容纳的最小范围。您可以从所需范围推断出最小位数。您可以从中推断出最小大小(以字节为单位)以及CHAR_BITdefines 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位,所以你得到以下大小:

  • 无符号短:16位
  • 无符号整数:32位
  • 无符号长:64位

你可以打赌,如果我们进入128位操作系统,会有一个由16个字节组成的数据类型(可能是unsigned long long?)。

从某种意义上说它是历史,但为什么建筑师会决定从这些尺寸开始? 原因如下:

  1. &#34;它足够大&#34;计算机科学家喜欢只做他们需要的工作,所以在大多数用例中,任何更大的integer数据类型都可能是浪费的,因为人们根本不需要用原始数据来计算那么高的数据类型。
  2. &#34;它的大小和我们能得到的一样大&#34;您希望integer完全适合单个寄存器,因此大小通常受硬件限制(寄存器只是一个示例)。
  3. 我确信有更智能,更有经验的StackOverflow成员可以提供的其他原因: - )

答案 3 :(得分:1)

在C中,int的大小是gcc(编译器的GNU集合)中的4个字节,以及borland和turbo c编译器中的2个字节。最后两个编译器特定于windows,而gcc编译器是Linux OS的编译器。 原始数据类型的大小基于编译器,这些编译器基本上特定于特定的OS。我个人更喜欢gcc编译器而不是其他编译器,因为它根据C语言的定义支持许多功能。其中一个例子是空指针。如果你在gcc中声明一个空指针并尝试在gcc中访问它,它会给你错误,但turbo c允许使用它没有错误。