2011-03-18 49 views
1

我想了解的是,在java.I内部如何扩展或缩小隐式转换知道它涉及位摆弄。java中的原始数据类型铸造 - 内部逻辑

例如:

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

//Explicit 
float d = (float) 2.23423; 

更新:

我看着张贴在这里的问题 Bitshifting to read/write data 。彼得Lawrey给了以下的答案后,写了这篇文章。

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

再次重申同样,扩大转换像上面机器级发生或多或少与由Peter上述smiliar相同的逻辑。

请让我知道您宝贵的意见。

+1

JLS第5章介绍Java中可用的转换类型:[http://java.sun.com/docs/books/jls/third_edition/html/conversions.html]。它的实现与平台有关,通常发生在机器代码级别。 – mazaneicha 2011-03-18 12:30:26

回答

3

Java使用您的CPU支持的IEEE 754标准机器代码指令。因为这样的Java没有使用你可以进一步分解的东西来实现这个功能。

用于从双倍转换为浮点。

  • 符号被保留
  • 指数被截断,但如果数量过大也趋于无穷大,如果小,就变为零。
  • 这两种格式都有一个隐含的最高位,这是1,这是不变的。
  • 尾数的顶部23比特被保持(与第24比特的可选舍入)

对于float加倍该过程类似于除字段被扩展。

但是,这些都是在浮点处理器单元中完成的,而Java对它的发生方式没有任何作用。

+0

@mazaneicha:在机器代码级别,发生了什么@inovaovao 。 – 2011-03-18 12:35:51

+0

@Suresh S,他确实说过在代码级发生了什么,但他混淆了unsigned int/long值(Java没有)与float/double发生的情况 – 2011-03-18 12:46:05

-1

double有64位,而float有32位。当你将一个double加入到一个浮点数中时,你只需要丢弃前32位。当你扩大你只需添加多个0位来填充更大的类型,例如你在一个int的32位的前面添加32个零作为一个长整数。

+1

-1:位长64位双。如果你删除了64位双精度型的第一个32位,你会得到无用的随机数据。顺便说一句:扩展的0位从int转换为long对于unsigned int值是正确的(Java没有) – 2011-03-18 12:45:01

+0

@Peter你是对的:对于双打来说它有点复杂。你知道细节吗? – inovaovao 2011-03-18 12:47:54

+0

看我的编辑。它更复杂。 ;) – 2011-03-18 12:48:35