Java 为什么分配';int常量->;字节变量';有效,但';长常数->;int变量';不是吗?
我有以下代码片段:Java 为什么分配';int常量->;字节变量';有效,但';长常数->;int变量';不是吗?,java,casting,primitive,Java,Casting,Primitive,我有以下代码片段: int i = 5l; // not valid (compile error) byte b = 5; // valid 你觉得怎么样 为什么?这里假设一下,因为不太可能有一个明确的答案 为了 编译器假定您编写5l而不是5有一个很好的理由,因此这是一个错误 为了 没有写5的byte文字方式,因此坚持每次都写(byte)5是不必要的迂腐,事实上,这很容易出错 byte b = 222; // is an error byte b = (byte) 222; /
int i = 5l; // not valid (compile error)
byte b = 5; // valid
你觉得怎么样
为什么?这里假设一下,因为不太可能有一个明确的答案 为了 编译器假定您编写
5l
而不是5
有一个很好的理由,因此这是一个错误
为了
没有写5的byte
文字方式,因此坚持每次都写(byte)5
是不必要的迂腐,事实上,这很容易出错
byte b = 222; // is an error
byte b = (byte) 222; // is NOT an error
语言规范允许(请注意,5、127或128是整数文本): 这将生成错误:
byte b = 128;
这称为隐式缩小原语转换,JLS允许:
此外,如果表达式为常数表达式(§15.28),则
键入byte、short、char或int:
如果变量的类型为byte、short或char,并且常量的值为
表达式可以用变量的类型表示
下面是由于上述语句而导致的编译器错误
int i = 5l;
5l
是长的,而不是类型为byte、short、char或int的常量表达式(§15.28)。此外,如果变量的类型为byte、short或char,则该变量也不正确,因为它是int,bacause,定义如下:
如果表达式是byte、short、char或int类型的常量表达式(§15.28),如果变量的类型是byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用缩小原语转换
因此:
在第一种情况下
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
我现在想到的一件事是为什么
inti=5l代码>不可能,因为long的范围大于int range,因此将long值放入int的变量中是不可能的
整数范围:-2147483648…2147483648,以及
远距离:-2^63…2^63-1根据我的理解
因为您必须将类型long转换为int,对于第一个选项,即
int i = (int) 5l;
在第二种情况下,由于字节的赋值与int的赋值相同
你们认为我在给字节赋值吗
byte b= 5; ????
不,它不是,它得到的值是byte本身,因为byte的范围是-128到127
有关更多详细信息,请参见,其中没有解释第一条语句无法编译的原因。请查看+1。您可以添加最后一条语句是编译的,因为final
值是内联的。“如果表达式是byte、short、char或int类型的常量表达式(§15.28)”,出现在引用语句之前,可能也很重要,因为密切相关的语句byte b=5l代码>不起作用。@assylias,我的意思是内联的
。这意味着编译器将值放入代码中,就像您在那里键入它一样,即字节码将读取byte b=5
@kockostatic final
是内联的,但我不认为非staticfinal
变量是内联的。@assylias,我认为是。如果在一个方法中定义了一个final
变量,然后实现一个匿名类并传递final
变量,它将被内联(这就是它编译的原因)5-(int-4字节)->b(字节-1字节)。1@gstackoverflow对不起,这是错误的假设。那么你如何在那里写/表示一个字节呢?那么你如何在那里写/表示一个字节呢LOOOOOOOOOL@gstackoverflow所以你在笑你错过的那一点:)值的范围-128到127
适合一个字节。5
是一个整数,整数的范围大于字节,并且仍然字节b=5代码>编译…当然它会被编译,因为字节b=5,数字5在字节本身可以接受的范围内。字节的范围是-128…127。这是正确的。我不参与那个句子,而是参与int I=5l;
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
int i = (int) 5l;
byte b= 5; ????