理解"可能的精度损失需要char找到字节"

时间:2014-04-09 07:13:49

标签: java

class A  {   
    public static void main(String [] varun) {
        byte b = 65;
        char ch = b;
        System.out.println(ch);
    }
}

为什么会出错:

  

可能损失精度
    所需的字母     找到了字节

7 个答案:

答案 0 :(得分:6)

错误文字具有误导性。

char是2字节无符号类型(范围0到65535)

byte是1字节签名类型(范围-128到127)。

因此byte无法在char中完全表示一般性(因为您将丢失底片)。所以你得到一个错误;虽然误导了一个。

答案 1 :(得分:3)

字节长度为1个字节,而char长度为2个字节,因此它们不兼容。你需要使用cast:

class A 
{   
    public static void main(String [] varun)    
    {
        byte b = 65;
        char ch = (char) b;
        System.out.println(ch);
    }
}

答案 2 :(得分:0)

作为显式转换添加为byte只需要一个字节,char在java中是两个字节,而隐式类型转换不适用于byte和char。

使用

  

char ch =(char)b;

答案 3 :(得分:0)

您的代码应该是这样的:

char ch = (char) b;

它给你的错误是因为字节类型是8位整数,而字符是1位加上编码位(UTF-8,ASCII等)。
字节流和字符流之间的区别在于字符流尝试使用字符而不是字节。 所以字节流是没有编码的8比特流。这就是您遇到此错误的原因。

答案 4 :(得分:0)

如果为彼此分配了两种不同类型的基元您可能有两种类型的转换:

  • 如果您将int分配给long,从而将较小的类型放入较大的类型中执行扩展和所谓的扩展转换 - 它也称为隐式转换

    int a = 100; 长b = a;

  • 另一方面,如果您要执行从longint的转换,则
  • 缩小类型。因此,如果你不这样做,你需要执行显式演员你得到possible loss of precision

    长a = 100L; int b =(int)a;

或者在你的情况下,因为@Bathsheba说“因此一个字节不能完全通用地表示在字符中(因为你将丢失负片)。所以你得到一个错误;虽然是误导的。” - 您需要明确强制转换,以便了解丢失的数据。

答案 5 :(得分:0)

当一种类型的数据被分配给另一种类型的变量时,自动类型转换 如果满足以下两个条件,将会发生: •这两种类型兼容。 •目标类型大于源类型。

当满足这两个条件时,会发生扩大转换。

所以原因是,

对于扩展转换,数值类型,包括整数和浮点类型, 相互兼容。但是,没有自动转换 数字类型为char或boolean。

答案 6 :(得分:0)

bytechar的转换是所谓的Widening and Narrowing Primitive Conversion (JLS 5.1.4)

  

首先,byte通过扩展原始转换(§5.1.2)转换为int,然后生成的int转换为char通过缩小原始转换(§5.1.3)。

byteint的扩展转换很好(两者都已签名),但从intchar将会丢失符号和(可能)范围(如char为0到65536):

  

缩小图元转换可能会丢失有关数值整体幅度的信息,也可能会丢失精度和范围。

  

有符号整数到整数类型T的缩小转换只会丢弃除n个最低位之外的所有位,其中n是用于表示类型T的位数。除了可能丢失有关幅度的信息之外数值,这可能导致结果值的符号与输入值的符号不同。

由于精度,符号和信息的这种潜在损失,您会收到编译错误,并且需要进行显式转换以向编译器发出信号,表明您知道自己在做什么。