将一个小数字分配给 unsigned long long 数据类型而不进行强制转换
Assign a small number to unsigned long long data-type without casting
我对将小数字分配给大数据类型变量有点困惑,例如在我的 code
(checkout online) :
#include <iostream>
int main()
{
unsigned long long num = 5000000000;
unsigned long long num2 = static_cast<unsigned long long>(5000000) * static_cast<unsigned long long>(1000);
unsigned long long num3 = 5000000 * 1000UL; // Casting 1000 to long data-type
unsigned long long num4 = 5000000 * 1000;
std::cout << num << std::endl << num2 << std::endl << num3 << std::endl << num4;
return 0;
}
输出为
5000000000
5000000000
5000000000
705032704
我知道 c++ 中的 literal casting 和 static_cast
特性以及总是使用数学语句中的最大数据类型。
但是问题来了,为什么语句unsigned long long num4 = 5000000 * 1000;
的结果是数字705032704
而不是5000000000
呢?顺便说一句,我知道当我像 5000000 * 1000UL;
一样投射它时它会给我 5000000000
(因为它投射到最大的数据类型)。
- 为什么
unsigned long long num4 = 5000000 * 1000;
语句在不直接使用转换的情况下不自动转换为 unsigned long long
数据类型?
5000000 * 1000
计算出来的数字705032704
是从哪里来的?
此致!
您的行 unsigned long long num4 = 5000000 * 1000;
由三个独立的部分组成,分别进行评估。
right-hand-side被计算为int
,因为所有的操作数都是int
。由于整数溢出,结果不是您所期望的。
left-hand-side 使 space 成为 unsigned long long
。
赋值将 right-hand-side 的(意外)结果复制到为变量分配的 space 中。
我对将小数字分配给大数据类型变量有点困惑,例如在我的 code
(checkout online) :
#include <iostream>
int main()
{
unsigned long long num = 5000000000;
unsigned long long num2 = static_cast<unsigned long long>(5000000) * static_cast<unsigned long long>(1000);
unsigned long long num3 = 5000000 * 1000UL; // Casting 1000 to long data-type
unsigned long long num4 = 5000000 * 1000;
std::cout << num << std::endl << num2 << std::endl << num3 << std::endl << num4;
return 0;
}
输出为
5000000000
5000000000
5000000000
705032704
我知道 c++ 中的 literal casting 和 static_cast
特性以及总是使用数学语句中的最大数据类型。
但是问题来了,为什么语句unsigned long long num4 = 5000000 * 1000;
的结果是数字705032704
而不是5000000000
呢?顺便说一句,我知道当我像 5000000 * 1000UL;
一样投射它时它会给我 5000000000
(因为它投射到最大的数据类型)。
- 为什么
unsigned long long num4 = 5000000 * 1000;
语句在不直接使用转换的情况下不自动转换为unsigned long long
数据类型? 5000000 * 1000
计算出来的数字705032704
是从哪里来的?
此致!
您的行 unsigned long long num4 = 5000000 * 1000;
由三个独立的部分组成,分别进行评估。
right-hand-side被计算为
int
,因为所有的操作数都是int
。由于整数溢出,结果不是您所期望的。left-hand-side 使 space 成为
unsigned long long
。赋值将 right-hand-side 的(意外)结果复制到为变量分配的 space 中。