所以当我偶然发现一个小问题时,我正在使用新数据类型 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;
}
答案 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)