【问题标题】:Primitive DataType Casting in java - Internal Logicjava中的原始数据类型转换-内部逻辑
【发布时间】:2011-03-18 12:21:51
【问题描述】:

各位,我想了解一下,扩大或缩小隐式转换是如何在 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);
}

为了重复相同,像上面那样扩大转换发生在机器级别或多或少地与彼得上面提到的类似逻辑相同。

请让我知道您宝贵的 cmets。

【问题讨论】:

标签: java types casting bit-manipulation


【解决方案1】:

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

用于从双精度到浮点数的转换。

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

float to double 的过程类似,只是字段被扩展。

然而,这一切都是在浮点处理器单元中完成的,Java 不参与其中。

【讨论】:

  • @mazaneicha:在机器代码级别,@inovaovao 所说的会发生。
  • @Suresh S,他确实说过在代码级别发生了什么,但他混淆了 unsigned int/long 值(Java 没有)发生的情况与 float/double 发生的情况跨度>
【解决方案2】:

double 有 64 位,而 float 有 32 位。当您将双精度转换为浮点时,您只需删除前 32 位。

反之亦然,当您加宽时,您只需添加尽可能多的 0 位来填充较大的类型,例如,您在 int 的 32 位前面添加 32 个零以形成 long。

【讨论】:

  • -1:您将 64 位 long 与 64 位 double 混淆了。如果您删除了 64 位双精度的前 32 位,您将获得无用的随机数据。顺便说一句:从 int 转换为 long 的 0 位扩展对于 unsigned int 值(Java 没有)是正确的
  • @Peter 你是对的:对于双打来说,它有点复杂。你知道细节吗?
猜你喜欢
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2022-11-27
  • 1970-01-01
相关资源
最近更新 更多