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

时间:2016-07-23 17:33:54

标签: c++

如果我这样做

 int n = 100000;
 long long x = n * n;

然后x == 1410065408

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

发生了什么事?  我正在使用VSC ++(默认VS c ++编译器)

3 个答案:

答案 0 :(得分:22)

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

尝试:

long long n = 100000;
long long x = n*n;

这是an answer that references the standard,指定long long x = (long long)n*nn的操作long long不会导致数据丢失。具体地,

  

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

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

答案 1 :(得分:3)

如前所述,将n声明为长整数是最佳解决方案。

正如对原始帖子的快速澄清一样,141006540​​8不是2 ^ 31,其价值如下:

100,000 ^ 2 = 10,000,000,000,以二进制形式存在:

10 0101 0100 0000 1011 1110 0100 0000 0000

C ++整数在内存中严格为32位。因此,前两位被忽略,值以二进制形式存储在存储器中:

0101 0100 0000 1011 1110 0100 0000 0000

在十进制中,这恰好等于141006540​​8。

答案 2 :(得分:2)

编辑 - 这是解决问题的另一种方法;这将做的是在乘法之前将整数值转换为很长的时间,这样你就不会截断位。

原始发布

int n = 100000;
long long x = static_cast<long long>( n ) * static_cast<long long>( n );

编辑 - Jossie Calderon提供的原始答案已被接受为有效答案,此答案增加了另一个有效的解决方案。