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;
问题 1)
这是因为0b11111111
是一个int
文字,其值为 255
。 此值不适合字节。 有关此内容的更多详细信息,请参阅 http://docs.oracle.com/javase/7/docs/technotes/guides/language/binary-literals.html。
问题2)
当我们写二进制或十六进制文字时,我们从不放符号。 文字0x80000000
实际上是一个负值,即使我们不这样写它。
JDK的制作者没有很好的理由选择使用十进制文字来表示-128
而使用十六进制文字来表示0x80000000
;除了在每种情况下,可能更清楚这种方式的意图。
所有整数文本都具有类型 int
(除非后缀为 L
或 l
)。 因此,在第一种情况下,您将int
存储到byte
中。 在没有强制转换的情况下,不允许像这样的缩小转换,除非右侧是常量,则允许值在范围内,这是-128
127
。 不过,0b11111111
是 255,不在范围内。
至于为什么允许int i = 0b11111111111111111111111111111111
:这几乎是"因为JLS这么说"。 事实上,该特定示例出现在 JLS 3.10.1 中。 有一条规则,类型 int
的十进制文本不能超过 214743647(特定情况除外-2147483648
),但没有关于二进制文本的规则,除了它们必须适合 32 位。
正如我在评论中提到的,第二个问题实际上是一个关于编写代码的程序员的风格偏好的问题,这是不可能回答的。