A.java:7: 错误: 不兼容的类型: 从int转换到byte可能会有损失
byte b1 = 0xAA; ^ A.java:9: 错误: 不兼容的类型: 从int转换到short可能会有损失 short s1 = 0xAAAA; ^ 2 个错误
编译时候,进行检查,看赋值大小是否超过变量的类型所容纳的范围。
如果超过,报错:从int转换到byte可能会有损失,
如果没超过,编译通过
变量的类型 该变量类型所容纳的范围 ( MAX_VALUE 十进制)初始值( 10 进制)初始值( 16进制)byte1271700xAAshort32767436900xAAAAint214748364728633158990xAAAABBBBlong9223372036854775807122978481477578173090xAAAABBBBCCCCDDDDL
从表中看出,两处(byte b1 = 0xAA; 和 short s1=0xAAAA;) 没有通过编译的原因,都是因为初始赋的值超过变量的类型所容纳的范围。长型 变量 l 的初始化值 0xAAAABBBBCCCCDDDD 同样也超过了长型变量的最大值。只是因为数值的尾部加了一个L,避免了上述的检查。但后来调用方法 System.out.println(l);, 就会看到一个“垃圾”输出: -6148895925951734307。整型变量 i 的初始化,编译时也没有检查(可能是用了16进制形式的缘故?)。从表中看出,0xAAAABBBB 已经超出了int型变量的最大正整数值:2147483647。所以“初始化”之后,若调用方法 System.out.println(i);, 就会看到一个“垃圾”输出: -1431651397。如果用10进制形式初始化: int i = 2863315899; 同样逃不掉编译器的眼睛: A.java:6: 错误: 过大的整数: 2863315899
int i= 2863315899;
^
1 个错误
回复 @pinitianjie : 值得深思/详谈。
编译器不对超限的int和long进行检查,这个是为什么
Java 中都是有符号数。最高位表示正/符,其余位是有效位。最高位是1时,要以补码进行计算
贴一个JLS 中的英文:
An integer literal is of type long if it is suffixed with an ASCII letter L or l (ell); otherwise it is of type int.
int i = 0XAAAABBBB;
byte b = 0XA;
short s = 0XAAA; 正常
0XAA 十进制为170,大于byte的最大值127 0XAAAA 被认为是int值,且大于了short的最大值32767,不能赋值为short。
long 是64位且声明了该16进制数为long型,且最高位为1进行逆补码运算后结果为-6148895925951734307
这错误鼠标悬浮应该会告诉你吧
你连基本类型的最大值和最小值都不知道,建议
大佬请讲解一下。定义一个short类型字段,怎么set值给他