c++ - 为什么 (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
?
解决方案
假设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
推荐阅读
- ajax - 链接点击更新数据
- r - R代码更改整个列的日期
- bigcommerce - 如何验证用户是否在自定义 API 中登录 BigCommerce?
- python - 在输入字母之前将字符串中的字母更改为大写和小写
- java - 如果我想做输出,Scanner/System.in 的模拟是什么?
- python - Discord bot 只能在手机上运行,为什么?
- python - 从使用 PIL 旋转的图像中删除黑条/多余部分
- django-forms - 无法保存对 Django ModelForm 博客编辑的更改;表单恢复到以前的状态
- c# - 是否有转换为对象并获取值的简写
- r - R 使用 rename_with() 使用通配符重命名多个列