class A {
public static void main(String [] varun) {
byte b = 65;
char ch = b;
System.out.println(ch);
}
}
为什么会出错:
可能损失精度
所需的字母 找到了字节
答案 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;
long
到int
的转换,则缩小类型。因此,如果你不这样做,你需要执行显式演员你得到possible loss of precision
长a = 100L; int b =(int)a;
或者在你的情况下,因为@Bathsheba说“因此一个字节不能完全通用地表示在字符中(因为你将丢失负片)。所以你得到一个错误;虽然是误导的。” - 您需要明确强制转换,以便了解丢失的数据。
答案 5 :(得分:0)
当一种类型的数据被分配给另一种类型的变量时,自动类型转换 如果满足以下两个条件,将会发生: •这两种类型兼容。 •目标类型大于源类型。
当满足这两个条件时,会发生扩大转换。
所以原因是,
对于扩展转换,数值类型,包括整数和浮点类型, 相互兼容。但是,没有自动转换 数字类型为char或boolean。
答案 6 :(得分:0)
从byte
到char
的转换是所谓的Widening and Narrowing Primitive Conversion (JLS 5.1.4)
首先,
byte
通过扩展原始转换(§5.1.2)转换为int
,然后生成的int
转换为char
通过缩小原始转换(§5.1.3)。
从byte
到int
的扩展转换很好(两者都已签名),但从int
到char
将会丢失符号和(可能)范围(如char
为0到65536):
缩小图元转换可能会丢失有关数值整体幅度的信息,也可能会丢失精度和范围。
和
有符号整数到整数类型T的缩小转换只会丢弃除n个最低位之外的所有位,其中n是用于表示类型T的位数。除了可能丢失有关幅度的信息之外数值,这可能导致结果值的符号与输入值的符号不同。
由于精度,符号和信息的这种潜在损失,您会收到编译错误,并且需要进行显式转换以向编译器发出信号,表明您知道自己在做什么。