为什么整数大小因计算机而异?
在计算机中,存储器是由以二进制格式存储信息的数字存储器组成的,最低的单位称为位(binary digit)。一位表示由两种状态组成的逻辑值,即 o 或 1。位是二进制数系统的一部分。使用这些位的组合,任何整数都可以用十进制数系统表示。
由于数字信息以二进制位存储,因此计算机使用二进制数系统来表示所有数字,例如整数。一个字节是一组 8 位。在像 C 这样的编程语言中,可以使用变量的类型来声明变量,因此为了将数值存储在计算机内存中,我们在内部使用位数来表示整数 (int)。
整数如何存储在内存中?
在上图中,可以看出整数是如何存储在主存中的。上图给出了十进制数,即以10为底的数字如何转换为二进制,即以2为底的数字系统,以及它是如何存储在内存中的。
为什么整数大小因计算机而异?
本节重点讨论整数大小因计算机而异的一些原因。以下是原因——
- C 和 C++ 的目标是在所有机器上提供即时代码。如果编译器必须确保 int 可能是该机器不常见的大小,则可能需要额外的指令。几乎在所有情况下,这都不是必需的,只需要它足够大,可以满足用户打算使用它的目的。
- C 和 C++ 的好处之一是编译器可以针对大量机器,从小型 8 位和 16 位微控制器到大型 64 位多核处理器。事实上,一些 18、24 或 36 位机器也是如此。如果某些机器具有 36 位的本机大小,那么用户将不会很高兴,因为某些标准是这样说的,由于额外的指令,您在整数数学中获得了一半的性能,并且不能使用最高 4 位诠释。
- 具有 8 位寄存器的小型微处理器通常支持尝试 16 位加法和减法(可能还有乘法和除法),但 32 位数学将涉及与这些指令并列的加倍,并且还需要更多的乘法和除法工作。所以 16 位整数(2 个字节)在这么小的处理器上更有意义——特别是因为内存可能也不是很大,所以为每个整数存储 4 个字节可能有点浪费。
- 对于 32 位或 64 位机器,内存范围可能要大很多,因此具有更大的整数并不是什么缺点,并且 32 位整数运算的速度与较小的相同,并且在某些情况下“更好” ”——例如在 x86 中,像加法或减法这样的 16 位基本数学运算需要一个额外的前缀字节来提及“使这个 16 位”,因此 16 位整数的数学运算会占用更多的代码空间。
这不是普遍正确的,但通常是正确的。将 int 扩展为 64 位并不是很有用。它浪费空间。如果需要,一个可以是 64 位长,而 int 仍然是 32 位。否则,对于需要 64 位整数的情况,只保留 long long。大多数当前的实现都执行之前的 64 位长。所以有 16 位整数(short)、32 位整数(int)和 64 位整数(long 和 long long),所有这些都是硬件支持的(在 x86 的情况下),允许用户为每个变量选择合适的类型。通常,除非硬件有充分的理由,否则形成大于其最小尺寸的种类是没有用的,因为符合标准的程序无论如何都不能期望它们更大,并且需要以最小尺寸正常工作。
为什么 Int 不是 16 位的?
它们在 32 位平台上是 32 位; 16 位操作数(32 位和 64 位)的指令编码比 32 位操作数长一个字节。如果在寄存器操作期间存储了 16 位值,则寄存器的其余部分无法使用,无论是在 32 位还是 64 位上,因为没有“高半 32 位寄存器”的指令编码。所以 32 位是操作数的一种自然大小。
下面是一个 C++ 程序,用于演示 64 位系统中整数的大小:
C++14
// C++ program for the above approach
#include
using namespace std;
// Driver Code
int main()
{
// sizeof() operator is used to
// give the size in bytes
cout << sizeof(int);
return 0;
}
C++14
// C++ program to implement
// above approach
#include
using namespace std;
// Driver code
int main()
{
// sizeof() operator is used
// to give the size in bytes
cout << sizeof(int);
return 0;
}
4
4
下面是一个 C++ 程序,用于演示 32 位 (x86) 系统中整数的大小:
C++14
// C++ program to implement
// above approach
#include
using namespace std;
// Driver code
int main()
{
// sizeof() operator is used
// to give the size in bytes
cout << sizeof(int);
return 0;
}
4
输出
2
不同整数大小的优点:
- 改变大小的好处之一是读取或写入所需的 CPU 周期更少。
- 给定架构的有效使用取决于 32 位或 64 位系统。
不同整数大小的缺点:
- 不同体系结构的变化并没有让程序员清楚地了解整数的大小,以便做出类型决策以进行进一步计算。
- 如果被误用,可能会导致内存出现各种问题,从而支持缓冲区溢出等攻击。
- 一个整数 溢出 如果某些程序试图在一个整数变量中存储一个大于该变量可以存储的最大值的值,则可能会发生这种情况。
- 不同大小可以使用多个 CPU 寄存器。例如,如果需要在 32 位机器中存储大于 2^32 的数字,则需要两个寄存器,对于 64 位机器也是如此。