Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么分配';int常量->;字节变量';有效,但';长常数->;int变量';不是吗?_Java_Casting_Primitive - Fatal编程技术网

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
@kocko
static final
是内联的,但我不认为非static
final
变量是内联的。@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; ????