1)为什么不允许以下任务:
byte b = 0b11111111; // 8 bits or 1 byte
但是这个任务是允许的:
int i = 0b11111111111111111111111111111111; //32 bits or 4 bytes
这两种类型都是签名的,我希望b和i是-1.
2)为什么整数MIN_VALUE没有符号?
public static final int MIN_VALUE = 0x80000000;
但字节MIN_VALUE确实有一个标志?
public static final byte MIN_VALUE = -128;
解决方法
所有整数文字都具有int类型(除非以L或l为后缀).因此,在第一种情况下,您将int存储到一个字节中.如果没有强制转换,则不允许进行这样的缩小转换,除非右侧是常量,如果值在范围内,则允许它为-128到127. 0b11111111是255,但不在范围内.
至于为什么允许int i = 0b11111111111111111111111111111111:它几乎是“因为JLS这么说”.实际上,该特定示例出现在JLS 3.10.1.有一个规则,int类型的十进制文字不能超过214743647(特定情况除外-2147483648),但是没有关于二进制文字的规则,除了它们必须适合32位.