首页 > 解决方案 > 为什么 (int)pow(2, 32) == -2147483648

问题描述

在网上我发现了以下问题:

int a = (int)pow(2, 32);
cout << a;

它在屏幕上打印什么?

首先我想到了0,但是在我编写代码并执行之后,我得到了-2147483648,但是为什么呢?

我也注意到 even (int)(pow(2, 32) - pow(2, 31))equals -2147483648

谁能解释为什么(int)pow(2, 32)等于-2147483648

标签: c++casting

解决方案


假设int您的机器上是 32 位(或更少),这是未定义的行为。

根据标准,conv.fpint

浮点类型的纯右值可以转换为整数类型的纯右值。转换截断;也就是说,小数部分被丢弃。如果截断的值不能在目标类型中表示,则行为未定义。

最常见int的是 32 位,它可以表示区间内的值,[-2^31, 2^31-1][-2147483648, 2147483647]. 的结果std::pow(2, 32)double表示精确值的 a 2^32。由于2^32超出了 可以表示的范围int,因此转换尝试是未定义的行为。这意味着在最好的情况下,结果可以是任何东西。

您的第二个示例也是如此:pow(2, 32) - pow(2, 31)只是 的double表示2^31,它(几乎)超过了 32 位可以表示的范围int

正确的方法是转换为足够大的整数类型,例如int64_t

std::cout << static_cast<int64_t>(std::pow(2, 32)) << "\n"; // prints 4294967296

推荐阅读