当前位置: 首页 > 知识库问答 >
问题:

将常量double强制转换为无符号会导致0,而非常量double则很好

岳和泽
2023-03-14
#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

老兄?在谷歌上搜索了一小段时间,却没有发现任何关于这件事的信息。

共有1个答案

东郭翰音
2023-03-14

来自CPPreference.com:

浮点类型的prvalue可以转换为任何整数类型的prvalue。小数部分被截断,即舍弃小数部分。如果值不能放入目标类型,则行为是未定义的(即使目标类型是无符号的,模算术也不适用)。如果目标类型为bool,则这是一个布尔转换(见下文)。

-400不能放入unsigned中,因此该行为未定义。试图推理任何类型的一致性都是没有用的。

由于这是未定义的行为,编译器在这种情况下可以做任何它想做的事情。通常情况下,他们会做任何可以使其馀的(定义的)行为更容易编码的事情。尽管流行的说法,编译器不太可能使魔鬼飞出你的鼻子,但一个不应该期待任何行为特别。

 类似资料:
  • 问题内容: 我正在实现一个接口,该接口的功能类似于可以包含某种对象的表的功能。该接口指定以下功能: 在我的实现中,我感到很困惑的是,我将表数据存储在2D 数组()中。当我需要返回值时,我想执行以下操作(假定只在包含double的列上调用,因此将没有): 但是- Java不允许强制转换为。将其强制转换为可以,因为它是一个对象,而不是基元,但是我的接口指定数据将以形式返回。 所以我有两个问题: 有什么

  • 问题内容: 我是Java的新手,正在尝试理解为什么第一个代码片段不会导致此异常,而第二个代码片段会导致此异常。由于在两种情况下都将字符串数组传递到Arrays.asList中,所以两个代码片段都不应该产生异常还是不产生异常? 第一个代码段(毫无例外): 第二段(导致上述异常): 如果相关,我正在Eclipse Helios中使用JavaSE 1.6。 问题答案: 对我来说(使用Java 1.6.0

  • 我正在尝试使用一个名为“start checknumber”的双变量,该变量的值应该为“40305555”,并将其转换为字符串。在调试我的代码时,startCheckNumber显示的值为4.030555e7。如果我执行以下命令将其转换为字符串,它将显示如下所示,而不是“4030555” 在这种情况下,有没有比使用ValueOf更好的方法将double变量转换为String?我尝试了'Double

  • 我试图创建一个函数,如果x和y是整数,则返回x和y之间的随机整数,但如果x或y是双精度的,则该函数返回x和y之间的双精度。但当我尝试使用整数时,它引发了一个异常:“类java.lang.integer不能转换为类java.lang.double(java.lang.integer和java.lang.double位于加载程序“引导程序”的模块java.base中)”“如何修复它?

  • 问题内容: 当我尝试将double数组转换为Double arrayList时,出现以下错误: 线程“主”中的异常java.lang.ClassCastException:[无法将D强制转换为java.lang.Double 下面是我的代码。 我正在将此列表与另一个列表进行比较,并将结果分配给另一个double变量。 请让我知道此错误的原因。 问题答案: las,不适用于原语。Apache com