将一个小数字分配给 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 castingstatic_cast 特性以及总是使用数学语句中的最大数据类型。

但是问题来了,为什么语句unsigned long long num4 = 5000000 * 1000;的结果是数字705032704而不是5000000000呢?顺便说一句,我知道当我像 5000000 * 1000UL; 一样投射它时它会给我 5000000000 (因为它投射到最大的数据类型)。

此致!

您的行 unsigned long long num4 = 5000000 * 1000; 由三个独立的部分组成,分别进行评估。

  • right-hand-side被计算为int,因为所有的操作数都是int。由于整数溢出,结果不是您所期望的。

  • left-hand-side 使 space 成为 unsigned long long

  • 赋值将 right-hand-side 的(意外)结果复制到为变量分配的 space 中。