2

因此,当我偶然发现一个小“问题”(示例来自 C++ Primer 第 6 版)时,我正在用新的数据类型long long进行一些测试。我正在使用 climits 库来告诉我longlong long支持的最大数量,结果都是 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;
}
4

3 回答 3

5

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

关于long longC++11,请参阅这个相关问题

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

于 2012-04-18T06:13:42.503 回答
5

因为您在 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
于 2012-04-18T06:15:36.223 回答
1

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)
于 2012-04-18T06:17:27.410 回答