java中的原始数据类型转换 - 内部逻辑

时间:2011-03-18 12:21:51

标签: java types casting bit-manipulation

我想了解的是,如何在java内部实现扩展或缩小隐式转换。我知道它涉及到小提琴。

例如:

//implicit
int i =2400;
long a = (long)i; 

//Explicit  
 float d = (float) 2.23423;

更新

我在看完这个问题后写了这篇文章 发布在这里Bitshifting to read/write data .Peter Lawrey给出了以下答案。

public long create(int one, int two){
    return ((long) one << 32) | (two & 0xFFFFFFFFL);
}

为了重新进行相同的扩展转换,上面的扩展转换或多或少地发生在机器级别上,与彼得提到的熟悉的相同逻辑。

请告诉我你宝贵的意见。

3 个答案:

答案 0 :(得分:3)

Java使用CPU支持的IEEE 754标准机器代码指令。因此,Java没有使用某些功能实现此功能,您可以进一步细分。

从double转换为float。

  • 保留标志
  • exponent被截断,但是如果数字太大则会变为无穷大,如果变小,则变为零。
  • 这两种格式都有一个隐含的顶部位,即1,这是不变的。
  • 保留尾数的前23位(可选择舍入第24位)

对于浮点数加倍,除了扩展字段外,该过程类似。

然而,这一切都是在浮点处理器单元中完成的,Java并没有参与它的发生。

答案 1 :(得分:1)

查看this article关于缩小和扩大原始转换的信息。

答案 2 :(得分:-1)

double有64位,而float有32位。将double转换为float时,只需删除前32位。

副作用当你扩展你时只需添加0位来填充更大的类型,例如你在int的32位中添加32个零来构成一个长的。