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


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

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

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


3099
2018-03-20 03:26


起源

“有什么理由再也不能用2个字节了吗?”当然可以 能够 保持2个字节,但通常选择另一个大小来提高性能。如果C卡在大约20世纪70年代的“第一”整数大小,我们可能会使用18位或谁知道什么。它的C适应性使其成为一种40多年的语言。 - chux


答案:


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

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

选择一个整数在某些系统中的大小为2个字节,在其他系统中为4个字节的原因是什么?有什么理由不能继续2字节吗?

C ++标准没有以字节为单位指定整数类型的大小,但它指定了它们必须能够容纳的最小范围。您可以从所需范围推断出最小位数。您可以从中推断最小大小(以字节为单位)和值 CHAR_BIT 那个宏 定义一个字节中的位数 (除了最模糊的平台之外,它只有8,而且不能低于8)。

查看 这里 了解更多信息。


4
2018-03-20 04:19





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

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

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

那就是“上面的组合”。


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


6
2018-03-20 03:38





看来你的第一个问题已经回答了,所以我会在第二个问题上做一个问题:

选择一个整数在某些系统中的大小为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位操作系统,将会有一种数据类型(可能 unsigned long long?)由16个字节组成。

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

  1. “它足够大”计算机科学家喜欢只做他们需要的东西,所以 integer 任何更大的数据类型在大多数用例中都可能是浪费的,因为人们根本不需要用原始数据类型来计算那么高。
  2. “它和我们一样大”你想要一个 integer 完全适合单个寄存器,因此大小通常受硬件限制(寄存器只是一个例子)。

我确信有更聪明,更有经验的StackOverflow成员可以提供的其他原因:-)


1
2018-03-20 04:33



在一些编译器中, sizeof(long) == sizeof(int)。无法保证 sizeof(long) > sizeof(int),但C ++标准确实决定了这一点 sizeof(long) >= sizeof(int)。 - Remy Lebeau


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


1
2018-03-20 04:44



sizeof(int) 自16bit操作系统的旧时代以来,Borland编译器中没有2个。在32位和64位操作系统中, sizeof(int) 来自Embarcadero(Borland的继任者)的最新C ++ Builder在不久的将来会为OSX和iOS以及Android提供C ++编译器。 - Remy Lebeau