什么决定了基本数据类型的大小

What determines the size of primitive data types?

本文关键字:数据类型 决定了 什么      更新时间:2023-10-16

对于我的一个c++编程作业,我必须在设计程序时考虑整数变量的大小。我在网上看了一下,大多数地方都说"整数的大小取决于平台。"我不清楚这是什么意思,所以我在这里问。

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

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

他们在这里指的是什么平台

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

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

应该是"Combination of above"


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

了解更多信息。

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

取决于编译器。反过来,编译器通常取决于体系结构、处理器、开发环境等,因为它要考虑到这些因素。所以你可以说它是所有的组合。

为什么在某些系统中选择2字节的整数,而在其他系统中选择4字节的整数?有什么原因使它不能继续2字节了吗?

c++标准没有指定整型的字节大小,但它指定了整型必须能够容纳的最小范围。您可以从所需的范围中推断最小大小(以位为单位)。你可以从中推断出最小的字节大小,以及定义字节中位数的CHAR_BIT宏的值(除了最模糊的平台,它是8,不能小于8)。

查看更多信息

看来你的第一个问题已经得到了回答,所以我将尝试回答第二个问题:

为什么在某些系统中选择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位
  • Unsigned int: 32位
  • Unsigned long: 64位

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

所以从某种意义上说,这是历史,但是为什么建筑师要决定这些尺寸呢?有几个原因:

    计算机科学家喜欢只做他们需要做的事情,所以integer数据类型更大可能在大多数用例中是浪费的,因为人们根本不需要用原始数据类型计算那么高。
  1. "It's as big as we can get"您希望integer完全适合单个寄存器,因此大小通常受硬件限制(寄存器只是一个例子)。

我相信还有其他更聪明,更有经验的StackOverflow成员可以给出的原因:-)

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