gpt4 book ai didi

java - java中基本类型的转换规则

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:33 25 4
gpt4 key购买 nike

在Java中,

有整数类型(char/short/int/long/byte)

有 float 类型(float/double)

有 boolean 型(boolean),不是整型,不像C语言。

问题:

  1. 是否有通用的转换规则(根据 JLS),可以将哪种类型转换为另一种类型?出于常识,我知道不允许将整数和浮点类型转换为 boolean

  2. 请帮助我理解以下输出的原因:

         /*
    * Casting rules for primitive types
    */
    double aDoubleValue = 30000000000000000000.123438934;
    int doubleToInt = (int)aDoubleValue; //stores max value 2147483647, makes sense!!
    byte doubleToByte = (byte)aDoubleValue; //stores -1, why not 127?
    short doubleToShort = (short)aDoubleValue; // stores -1, why not 32767?
    long doubleToLong = (long)aDoubleValue; // stores 9223372036854775807, makes sense!!
    float doubleToFloat = (float)aDoubleValue; // stores 3.0E19, 3.0 x 10^19 max value of float
    char doubleToChar = (char)aDoubleValue; // what does this store?

最佳答案

JLS lists

19 specific conversions on primitive types are called the widening primitive conversions:

  • byte 到 short、int、long、float 或 double
  • short 到 int、long、float 或 double
  • char 到 int、long、float 或 double
  • int 到 long、float 或 double
  • 长期 float 或加倍
  • float 到两倍

请注意缺少从 byteshortchar 的转换,即使 char 是两个字节长。

其他一切都需要显式转换。 Narrowing有点复杂:

  • doublefloat 使用标准 IEEE 754 舍入。
  • 整数值将其最高有效位剥离到目标类型的可用宽度。这可能会导致出现符号位,例如(byte)0xfff == (byte)-1;
  • 如果源类型是浮点型且目标类型是long,则通过向零舍入来转换值。
  • 如果源类型是浮点型且目标类型是整型但不是long,则首先通过向零舍入将值转换为int。然后使用整数转换将生成的 int 转换为目标类型。

例子:

int doubleToInt = (int)aDoubleValue; 

根据舍入规则产生 Integer.MAX_VALUE

byte doubleToByte = (byte)aDoubleValue; 

首先转换为 int,生成 Integer.MAX_VALUE,然后将其转换为 byteInteger.MAX_VALUE0x7fffffff,因此字节值 0xff-1

short doubleToShort = (short)aDoubleValue;

再次相同:转换为 int,产生 Integer.MAX_VALUE0x7fffffffshort 产生 0xffff,即 -1

棘手的事情实际上是 to-char 转换。 char 是单个 16 位 unicode 字符,因此 char doubleToChar = (char)aDoubleValue 为您提供现在熟悉的 '\uffff'规则。

可以看出,浮点和整数缩小操作之间存在差异。浮点运算执行实际舍入,而整数运算执行按位钳位。

整数语义可能是从 C 继承的。至少浮点到整数缩小操作的第一步也是您所期望的。第二个缩小步骤,从 double/float 到 short、byte 和 char 可能看起来有点令人惊讶,但如果你真的将 float 转换为 short,你可能应该仔细检查你是否知道你在做什么。

关于java - java中基本类型的转换规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30776256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com