在添加时需要使用字节数据类型进行类型转换吗?

时间:2011-12-13 06:51:39

标签: java

我遇到以下代码的问题:

     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?

7 个答案:

答案 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   发生编译时错误。

如果满足以下所有条件,则可以使用缩小基元转换:

  
      
  1. 表达式是byte,short,char或int类型的常量表达式。
  2.   
  3. 变量的类型是byte,short或char。
  4.   
  5. 表达式的值(在编译时已知,因为它是一个常量表达式)可以在类型中表示   变量。
  6.   

答案 4 :(得分:1)

int添加到byte后,byteimplicitly转换为int,但转换intbyte不会隐式地完成它,它应该明确地完成。

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?