为什么数据类型 long 支持的最大数量等于 long long?
Why does the data type long support a maximum number equal to long long's?
所以我在很久以前就用新数据类型做了一些测试,当我偶然发现了一个小"问题"(示例来自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) - 到 9,223,372,036,854,775,807)
long
long
应至少为 64 位(范围从 –9,223,372,036,854,775,808 相关文章:
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在C++中打印指向不同基元数据类型的指针的内存地址
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何计算数据类型的范围,例如int
- C++中数据类型修饰符的顺序
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 特定数据类型的模板类
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 有没有办法提示用户使用哪种数据类型作为模板 c++
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何获取C++字符数据类型的地址
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- Arduino代码:移动位似乎将数据类型从int更改为long
- 为什么数据类型 long 支持的最大数量等于 long long?
- GCC编译器是否可以处理比long / long / int更大的其他数据类型?
- 函数定义中使用的两种数据类型to_string(long double _Val)
- 为什么对于 long int 数据类型,左位移位<<移位不会超过 31?
- 何时使用 std::complex<long double> vs. 自己的复杂数据类型(结构等)