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
,从而将较小的类型放入较大的类型,则执行加宽和所谓的加宽转换-也称为隐式转换 INTA=100; 长b=along
- 另一方面,如果要执行从
到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;