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

时间:2012-04-18 06:10:41

标签: c++

所以当我偶然发现一个小问题时,我正在使用新数据类型 long long 进行一些测试(例子来自C ++ Primer第6版)。我正在使用climbits库告诉我 long 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;
}

3 个答案:

答案 0 :(得分:5)

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

关于C ++ 11中的long long,请参阅this related question

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

答案 1 :(得分: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

答案 2 :(得分: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)