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

12

为了我的C++编程作业之一,我需要在设计程序时考虑整数变量的大小。我在互联网上读了一些资料,大多数地方都说“整数的大小取决于平台。” 我不清楚这是什么意思,所以我在这里问。

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

    • 处理器体系结构(可能是指令集大小)。
    • 操作系统
    • 编译器
    • 以上三个因素的组合。
  2. 在某些系统中选择将整数的大小设为2字节,而在其他系统中设为4字节的原因是什么?现在是否还有理由不能继续使用2字节?


它不能再使用2个字节的原因是什么?当然,它可以继续使用2个字节,但其他大小通常会为了性能而选择。如果C语言在1970年代坚持使用“第一”整数大小,我们可能会使用18位或者谁知道什么样的类型。正是C语言的适应性使得它成为一门超过40年的编程语言。 - chux - Reinstate Monica
4个回答

6

这里所说的平台是什么意思。

通常,它指的是操作系统、编译器以及编译器的一些特殊选项的组合。

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

这将是“上述组合”。


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


5
什么决定了原始数据类型的大小? 这取决于编译器。编译器通常考虑架构、处理器、开发环境等因素。因此,你可以说它们的组合决定了原始数据类型的大小。 为什么有些系统中选择整数大小为2个字节,而在其他系统中为4个字节?现在不能再使用2个字节吗? C ++标准没有规定整数类型的字节数,但它指定了它们必须能够容纳的最小范围。你可以从所需范围推断出最小位数。你可以从中推断出最小字节数,并且通过 CHAR_BIT 宏的值(它定义一个字节中的比特数,除了最不常见的平台外,它是8,并且不能小于8)。
欲了解更多信息,请查看这里

1

在C语言中,int类型的大小在gcc(GNU编译器集合)中为4字节,在Borland和Turbo C编译器中为2字节。后两个编译器是专门为Windows设计的,而gcc编译器则是Linux操作系统的编译器。 基本数据类型的大小取决于编译器,这些编译器基本上是针对特定操作系统的。我个人更喜欢gcc编译器,因为它支持很多C语言的定义功能之一是空指针。如果你在gcc中声明一个空指针并尝试在其中访问它,它会给你错误,但Turbo C允许使用它而不报错。


自从16位操作系统的旧日以来,Borland编译器中的sizeof(int)已经不再是2。在32位和64位操作系统中,sizeof(int)为4。另外值得一提的是,Embarcadero(Borland的继承者)最新的C++Builder支持OSX和iOS的C++编译器,并且将来还会支持Android。 - Remy Lebeau

1
似乎你的第一个问题已经有答案了,所以我来回答第二个问题:为什么一些系统选择整数大小为2字节,而另一些系统选择4字节?还有没有理由不能继续使用2字节?
这取决于架构设计师(或编译器等)的意见。很多时候,内存地址被表示为无符号整数数据类型。因此,你得到了这个有趣的历史现象——整数大小反映了操作系统中地址的大小。也就是说,这并不是巧合:
- 16位地址系统使用2字节整数。 - 32位地址系统使用4字节整数。 - 64位地址系统使用8字节整数。
不过,这只是惯例,并不是硬性规定。
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成员可以给出其他原因 :-)


3
在某些编译器中,sizeof(long)的大小等于sizeof(int)。虽然不保证sizeof(long)大于sizeof(int),但C++标准规定sizeof(long) >= sizeof(int) - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接