为什么数据类型 long 支持的最大数量等于 long long?

Why does the data type long support a maximum number equal to long long's?

本文关键字:long 数据类型 支持 为什么 最大数      更新时间:2023-10-16

所以我在很久以前就用新数据类型做了一些测试,当我偶然发现了一个小"问题"(示例来自C++入门第6版)。 我正在使用 climits 库来告诉我长和长支持的最大数量,并且都出来9223372036854775807。 这怎么可能?

#include <iostream> 
#include <climits>
int main()
{
    std::cout << "int size is " << sizeof(int) << " bytes." << std::endl;
    std::cout << "short size is " << sizeof(short) << " bytes." << std::endl;
    std::cout << "long size is " << sizeof(long) << " bytes." << std::endl;
    std::cout << "long long size is " << sizeof(long long) << " bytes." << std::endl;
    std::cout << "Maximum values: " << std::endl;
    std::cout << "int: " << INT_MAX << std::endl;
    std::cout << "short: " << SHRT_MAX << std::endl;
    std::cout << "long: " << LONG_MAX << std::endl;
    std::cout << "long long: " << LLONG_MAX << std::endl;
    return 0;
}

因为您运行的是在 64 位计算机上,其中编译器将"long"和"long long"实现为 64 位整数。

如果你要为 32 位机器编译它,你会看到不同。例如:

$ g++ -m32 size.cpp
$ ./a.out 
int size is 4 bytes.
short size is 2 bytes.
long size is 4 bytes.
long long size is 8 bytes.
Maximum values: 
int: 2147483647
short: 32767
long: 2147483647
long long: 9223372036854775807
这是

可能的,因为标准要求long必须至少int一样大,long long必须在long至少与一样大(在C++11中至少为64位)。所以没有矛盾。

关于C++11中的long long,请参阅此相关问题。

由于您C++标记了问题,请记住,给定类型的数字限制在limits标题中给出,并且 C99 中的标准(即 <climits> 中的内容)不一定是C++中的标准,即它可能是实现定义的。long long中的位数(或者更明确地说,其值范围)是 C 中仅在 C++11 中成为标准的一个例子。

C99 标准规定了每种类型必须能够表示的值范围 (§5.2.4.2.1)。指定的值是最小量级,因此没有什么可以阻止具有更大的范围。我将此值转换为在数字计算机上表示这些范围内的数字所需的最小位数。

  • int应至少为 16 位(范围从 –32,768 到 32,767)
  • long应至少为 32 位(范围从 –2,147,483,648 到 2,147,483,647)
  • long long应至少为 64 位(范围从 –9,223,372,036,854,775,808
  • 到 9,223,372,036,854,775,807)