即使分配给 uint64_t 时,乘法期间也会发生有符号整数溢出

Lio*_* An 2 c++

菜鸟问题 - 为什么这会导致有符号整数溢出?

我想testNum能容纳这么大的数量吗?

int main(int argc, char* argv[]) {
  int a = 500000000;
  int b = 5;
  uint64_t testNum = a * b;
  std::cout << testNum << std::endl; 
} 
Run Code Online (Sandbox Code Playgroud)

我收到以下运行时错误

runtime error: signed integer overflow: 500000000 * 5 cannot be represented in type 'int'
Run Code Online (Sandbox Code Playgroud)

我发现有两种解决方法:

  1. 将 a 和 b 声明为uint64_t
  2. a * b在like前面插入“类型转换”uint64_t testNum = (uint64_t) a * b;

我不确定的是,为什么如果没有解决方法,这段代码就无法工作?

t.n*_*ese 7

a * b在将其分配给 之前完成testNum,并且ab都是int并且两个相乘的结果int是 an int

因为(uint64_t) a * b; a转换为uint64_t然后乘以b

作为附加说明:在大多数情况下,您希望避免 c 风格的情况 ( (type)),而是希望使用明确说明必须执行什么转换的转换,例如static_cast<uint64_t>(a)

  • @LionellLohJianAn - 语言规则。 (4认同)