为什么分配'int constant - >字节变量'有效,但'长常数 - > int变量'不是吗?

时间:2014-02-14 11:33:00

标签: java casting primitive

我有这段代码:

int i = 5l; // not valid (compile error)
byte b = 5; // valid

你怎么看?

为什么?

6 个答案:

答案 0 :(得分:8)

这在the JLS #5.2 (Assignment conversion)

中定义
  

如果表达式是byte,short,char或int类型的常量表达式(第15.28节),如果变量的类型是byte,short或char,则可以使用缩小的原语转换,并且常量表达式可以在变量的类型中表示。

这样:

byte b = 5; //ok: b is a byte and 5 is an int between -128 and 127
byte b = 1000; //not ok: 1000 is an int but is not representable as a byte (> 127)
byte b = 5L; //not ok: 5L is a long (and not a byte, short, char or int)
int i = 5L; //not ok: i is not a byte, short or char
int i = 5; byte b = i; //not ok: i is not a constant
final int i = 5; byte b = i; //ok: i is a constant and b is a byte

答案 1 :(得分:1)

假设在这里,因为不太可能有明确的答案。

有关

int i = 5l;

编译器假设你有一个很好的理由写了5l而不是5,所以这是一个错误。

有关

byte b = 5;

没有byte文字的写作方式5,所以每次写(byte) 5并且实际上它会容易出错是不必要的迂腐。

byte b = 222;        // is an error
byte b = (byte) 222; // is NOT an error

答案 2 :(得分:1)

语言规范允许(注意5,127或128是整数文字):

    byte b = 127; 

这会产生错误:

    byte b = 128;

这称为隐式缩小基元转换,JLS允许:

  

另外,如果表达式是常量表达式(§15.28)   输入byte,short,char或int:

     

如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量的值   表达式可以在变量的类型中表示。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

所以,由于上面的陈述

,下面是编译器错误
int i = 5l;

5l很长,而不是 常量表达式(第15.28节),类型为byte,short,char或int 。它也不正确,因为它是一个int,如果变量的类型是byte,short或char ,则

答案 3 :(得分:0)

在第一种情况下

int i = 5l;  // trying to allocate 64bits in 32 bits space. Err

其中

byte b = 5; //  byte can represented in a  range is -128 to 127. Compiles fine

答案 4 :(得分:0)

我现在想到的一件事是int i = 5l;为什么不可能,因为long的范围大于int范围,因此将long值放在int的变量中是不可能的。

int范围: -2147483648 ... 2147483648 ,和 长距离: -2 ^ 63 ... 2 ^ 63-1

答案 5 :(得分:0)

根据我的理解,

因为你必须将类型long转换为int,对于第一个选项,即

int i = (int) 5l;

,在第二种情况下,因为对byte的赋值与赋值给int相同,

你认为我在这里为字节分配int值

byte b= 5; ????

不,不是,它将值作为字节本身,因为字节的范围是-128到127,

有关详细信息,请参阅HERE