有一些东西让我困惑,我没有找到关于VM规范的太多信息。这有点晦涩,如果有人能给我解释一下就好了。
这几行代码......
double myTest = Double.MAX_VALUE;
System.out.println("1. float: " + (float)myTest);
System.out.println("2. int: " + (int)myTest);
System.out.println("3. short: " + (short)myTest);
System.out.println("4. byte: " + (byte)myTest);
..... 生成此输出:
byte
、short
和int
是8位、16位和32位,带有两个补码float
和double
是32位和64位的IEEE 754(参见此处)。
根据我的理解,最大值的双
意味着尾数的所有位(52位)都切换到1。因此,转换为短或字节返回-1,即所有位都切换为1,这并不奇怪。它似乎保持'尾'的双
,使其适合8位字节
或16位短
。
令我惊讶的是对int
的强制转换,以及在较小程度上对浮动
的强制转换。如何可能得到"2. int: 2147483647"这是0x7FFFFFFF,最大值而短和字节3.和4.是-1?
对浮动
的强制转换也很奇怪。如果保留了myTest
尾部的32位,那么它不应该生成一个NaN
吗?
JLS在第5.1.3节中详细说明了缩小原始转换的规则。规则取决于目标类型。
float
:
从二进制到浮点的缩小基元转换受IEEE 754舍入规则(§4.2.4)管辖。这种转换可能会失去精度,但也会失去范围,导致非零倍数的浮点零和有限倍数的浮点无穷大。双NaN转换为浮点NaN,双无穷大转换为同符号浮点无穷大。
int
和long
:
以下两种情况之一必须为真:
html" target="_blank">字节
,字符
和短
:
如果目标类型为byte
、char
或short
,则转换分两步进行。首先,如上所述,double
被转换为long
。然后,将long
转换为最终类型,如下所示:
有符号整数到整数类型T的缩小转换简单地丢弃了除n个最低阶位之外的所有位,其中n是用于表示类型T的位数。除了可能丢失关于数值大小的信息之外,这可能导致结果值的符号与输入值的符号不同。
我试图创建一个函数,如果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
问题内容: 我有以下两节课: 和: 当我运行测试时,一切都是笨拙的。如果我将类型参数化更改为: 编译器抱怨,报告: 错误:类型不兼容的整数不能转换为T number = new Integer(11); 其中T是类型变量T扩展了在方法getSomeValue(boolean)中声明的Object 它同样对Double有所抱怨。为什么? 编辑:我犯了一个错误。这实际上是有效的代码。 现在我明白了@S
问题内容: 让我们假设下表(例如,几个内部join语句的结果): 例如,您可以从以下语句中获取: 现在,如果我想将t1.column_1和t2.column_2总结如下 结果显示如下: 我的问题基本上是:有没有一种方法可以将NULL类型转换为0以便进行一些数学运算? 我曾尝试和,而是保持一个。 问题答案: 使用的列值转换到零。或者,COALESCE函数将执行相同的操作,除了(1)符合ANSI标准,
问题内容: 我有2个不同的Java项目,其中一个有2个类:。 在另一个项目中,我动态加载这两个类并将它们存储在 Object 然后,我继续使用创建一个对象并将其存储在该对象上,然后我还将创建一个对象并将其添加到会话中。 在Form项目的生命周期中,我调用从会话中加载先前创建的bean对象(我正在运行)。当我尝试将此对象投射回A时,它失败,并显示。 当我使用以下方法将对象拉出会话时 并使用 检查
问题内容: 从源(s,s,s)读取图像的最便捷方法是: 但是,然后, 如何转换为格式? 问题答案: 您可以创建所需类型的新BufferedImage,然后在其上绘制原始图像,如下所示: