繁体   English   中英

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

[英]Understanding “possible loss of precision required char found byte”

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

为什么会出错:

可能会失去精确度
所需的字符
找到了字节

错误文本具有误导性。

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

byte是1字节有符号类型(范围-128到127)。

因此,一个byte不能在完全通用的char中表示(因为你将丢失负数)。 所以你得到一个错误; 虽然误导了一个。

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

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

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

采用

char ch =(char)b;

你的代码应该是这样的:

char ch = (char) b;

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

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

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

    int a = 100; 长b = a;

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

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

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

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

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

所以原因是,

对于扩展转换,数字类型(包括整数和浮点类型)彼此兼容。 但是,没有从数字类型到char或boolean的自动转换。

bytechar的转换是所谓的扩展和缩小原始转换(JLS 5.1.4)

首先,通过扩展原语转换(第5.1.2节 )将byte转换为int ,然后通过缩小基元转换(第5.1.3节 )将结果int转换为char

byteint的扩展转换很好(两者都是有符号的),但是从intchar将松散符号和(可能)范围(因为char为0到65536):

缩小的原始转换可能丢失关于数值的总量值的信息,并且还可能失去精度和范围。

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

由于这种精度,符号和信息的潜在损失,您会收到编译错误,并且必须进行显式转换以向编译器发出信号,告知您正在执行的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM