Java “理解”;可能丢失所需的精度字符查找字节“;

Java “理解”;可能丢失所需的精度字符查找字节“;,java,Java,为什么它会给出一个错误: 可能的精度损失 所需字符 找到字节 字节长为1字节,而字符长为2字节,因此它们不兼容。您需要使用铸造: class A { public static void main(String [] varun) { byte b = 65; char ch = b; System.out.println(ch); } } Add as explicit cast as byte只取一个字节,char在j

为什么它会给出一个错误:

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


字节长为1字节,而字符长为2字节,因此它们不兼容。您需要使用铸造:

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

Add as explicit cast as byte只取一个字节,char在java中为两个字节,隐式类型转换不适用于byte和char

使用

char ch=(char)b


错误文本具有误导性

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

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


因此,
字节
不能在
字符
中完全通用地表示(因为您将丢失负数)。所以你得到了一个错误;尽管有误导性。

您的代码应该是这样的:

class A 
{   
    public static void main(String [] varun)    
    {
        byte b = 65;
        char ch = (char) b;
        System.out.println(ch);
    }
}
它给您的错误是因为字节类型是8位整数,字符是1位加上编码位(UTF-8、ASCII等)。
字节流和字符流之间的区别在于,字符流尝试使用字符而不是字节。
所以一个字节流是没有编码的8位流。这就是出现此错误的原因。

如果为彼此分配了两种不同类型的基本体,则可能有两种类型的强制转换:

  • 如果将
    int
    指定给
    long
    ,从而将较小的类型放入较大的类型,则执行加宽和所谓的加宽转换-也称为隐式转换

    INTA=100; 长b=a

  • 另一方面,如果要执行从
    long
    int
    的转换,则会缩小类型。因此,如果不执行显式强制转换,则需要执行显式强制转换,否则将导致
    可能的精度损失

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


或者,正如@Bathsheba所说的那样,“因此一个字节不能在一个字符中完全通用地表示出来(因为你会丢失负数)。因此你会得到一个错误,尽管这是一个误导性的错误。”-你需要显式强制转换,以便你意识到丢失了数据。

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

当满足这两个条件时,将进行加宽转换

所以原因是,

对于加宽转换,数字类型,包括整数和浮点类型, 相互兼容。但是,没有来自的自动转换
将数字类型转换为字符或布尔值。

字节
字符
的转换是所谓的

首先,通过扩大原语转换()将
字节转换为
int
,然后通过缩小原语转换()将得到的
int
转换为
char

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

缩小原语转换可能会丢失有关数值整体大小的信息,也可能会丢失精度和范围

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


由于这种潜在的精度、符号和信息损失,您会得到一个编译错误,需要显式强制转换来向编译器发出信号,表明您知道自己在做什么。

这是错误还是警告?请参阅更多的精神变态,试着制作
b
最终版
并移除演员阵容。@SotiriosDelimanolis试着不要太夸张。这不是精神变态。将final放在字节上会将其内联,因此可以安全地假设该字节不会低于0。不相信?将-65作为字节。您将得到一个编译器错误:)您可以将较小的内容放入较大的内容中。事实是char被签名了。试试看:inti=5;长l=i。而long是2倍大。你的论点是错误的。这是一种变通办法,不是一种解释。问题是为什么,而不是如何解决。简短、简洁、无强制类型转换,只有事实。JLS将
char
定义为一种整体类型:
char ch = (char) b;