我遇到以下代码的问题:
byte b=34; //successfully compiled
b=b+10; //compile time error
int x=34; //success
b=x; //compile time error
为什么b=34
编译成功,而整数文字默认为int
但是b=x
给出了编译时错误,而x是int?
答案 0 :(得分:2)
问题是byte b
是8位的字节,int x
是32位整数值。
因此,您的代码b=b+10
可以翻译为
b = 00100011b + 00000000000000000000000000001010b;
正如您所看到的,JVM将无法强制byte b
为int(通过将32位值推入8位注册表中),因此如果未进行类型转换,则存在类型不兼容(同样适用于b=x
)。
答案 1 :(得分:2)
如果不进行投射,请参阅The Elite Gentleman
回答。
以这种方式进行投射
byte b=34;
b=(byte)(b+10);
int x=34;
b=(byte)x;
答案 2 :(得分:1)
由于可能会失去精确度 你应该编码如下
byte b=34;
b=(byte)(b+10);
int x=34;
b=(byte)x;
答案 3 :(得分:1)
在您的代码段中,b=x;
不是可分配的。
来自JLS 5.2 Assignment Conversion。
如果表达式的类型无法转换为类型 通过赋值上下文中允许的转换变量,然后a 发生编译时错误。
如果满足以下所有条件,则可以使用缩小基元转换:
- 表达式是byte,short,char或int类型的常量表达式。
- 变量的类型是byte,short或char。
- 表达式的值(在编译时已知,因为它是一个常量表达式)可以在类型中表示 变量。
醇>
答案 4 :(得分:1)
将int
添加到byte
后,byte
将implicitly
转换为int
,但转换int
为byte
不会隐式地完成它,它应该明确地完成。
byte b=34;
b=(byte)(b+10);
int x=34;
b=(byte)x;
答案 5 :(得分:0)
因为整数数据类型可以包含比字节大得多的值,并且没有简单的规则来转换为字节。
在你的情况下:
b = (byte)x;
会有所帮助,
答案 6 :(得分:0)
井字节范围是-128到12y,因此您可以设置在将该字节转换为整数bcoz所需的arithemetic操作时的值,它将被视为整数值而不是字节值。
你不能直接从整数到字节类型转换bcoz整数大小大于你得到编译时错误的字节
检查此链接,了解结果如何从整数转换为字节How does Java convert int into byte?