c++ - 将负 const double 转换为 unsigned 结果为 0 而 non-const double 很好
问题描述
我有这个代码:
#include <iostream>
int main() {
double val = -400.0;
const double constVal = -400.0;
std::cout << val << std::endl;
std::cout << static_cast<unsigned>(val) << std::endl;
std::cout << constVal << std::endl;
std::cout << static_cast<unsigned>(constVal) << std::endl;
return 0;
}
当我运行它时,这是输出:
-400
4294966896
-400
0
为什么会这样?适度的谷歌搜索在这件事上没有显示任何内容。
解决方案
浮点类型的纯右值可以转换为任何整数类型的纯右值。小数部分被截断,即小数部分被丢弃。如果该值不适合目标类型,则行为未定义(即使目标类型是无符号的,模运算也不适用)。如果目标类型为 bool,则这是一个布尔转换(见下文)。
-400 不适合unsigned
,因此行为未定义。试图推理任何类型的一致性都是无用的。
由于这是未定义的行为,编译器可以在这种情况下做任何它想做的事情。通常,他们会做任何使他们(定义的)行为的其余部分更容易编码的事情。尽管流行说法,编译器不太可能让恶魔从你的鼻子里飞出来,但人们不应该期待任何特别的行为。
推荐阅读
- java - 在哪里存储我的 android 包的 PDF 文件
- r - R中大型数据集的ggplot geom_bar
- woocommerce - 如何在 woocommerce 中编辑标题
- azure-data-factory-2 - 如何在 ADF 中将字符串转换为日期时间?
- javascript - 如何在 graphql-tool 中传递查询参数?
- django - 使用 Django 将表单(用户输入)发布到管理面板中的小部件
- angular - 在不同文件中导入相同的 CSS 文件时防止重复
- python - 如何将 SQL 数据框中的列的单个 MIN 值作为标量返回?
- xcode - 为什么我在分发应用程序时在管理器中出现错误(xcode 10)
- validation - 在 Nova 中验证变异值