在C++中平移数字会产生错误的值

Chr*_*sto 7 c++

如果我做

 int n = 100000;
 long long x = n * n;
Run Code Online (Sandbox Code Playgroud)

然后 x == 1410065408

141006540​​8是2 ^ 31,但我希望x为64位

到底是怎么回事?我正在使用VSC++(默认VS c ++编译器)

Jos*_*ron 22

n*n太大了,int因为它等于10^10.(错误的)结果存储为a long long.

尝试:

long long n = 100000;
long long x = n*n;
Run Code Online (Sandbox Code Playgroud)

这是一个引用标准的答案,该标准指定操作long long x = (long long)n*nwhere nint是不会导致数据丢失的.特别,

如果两个操作数都具有有符号整数类型或两者都具有无符号整数类型,则具有较小整数转换等级类型的操作数应转换为具有较高等级的操作数的类型.

由于功能强制转换在此处具有最高优先级,因此它将左被乘数转换为a long long.右类型的被乘数根据标准int转换为a long long.没有损失发生.

  • @Chris是的,但是你不需要将n声明为64bit你可以简单地将n中的一个转换为long long,例如`long long x =(long long)n*n;` (5认同)
  • 所以它首先将两个整数相乘成一个int,然后将它分配给一个long,以便溢出的值被赋值,得到它. (4认同)
  • Logman 的评论很好,但我个人更喜欢 `long x = n*(long long)n;` 来表达转换发生在乘法之前,而不必记住优先规则。 (2认同)