了解Java数据类型

时间:2014-02-11 21:32:26

标签: java types byte primitive

1)为什么不允许以下任务:

byte b = 0b11111111; // 8 bits or 1 byte

但允许此作业:

int i = 0b11111111111111111111111111111111; //32 bits or 4 bytes

这两种类型都已签名,我希望bi为-1。

2)为什么整数MIN_VALUE没有符号?

public static final int   MIN_VALUE = 0x80000000;

但是字节MIN_VALUE确实有一个标志?

public static final byte   MIN_VALUE = -128;

2 个答案:

答案 0 :(得分:6)

问题1)

这是因为0b11111111int字面值,其值为255。该值不适合一个字节。有关详细信息,请参阅http://docs.oracle.com/javase/7/docs/technotes/guides/language/binary-literals.html

问题2)

当我们写二进制或十六进制文字时,我们从不放置符号。文字0x80000000实际上是负值,即使我们不这样写。

为什么JDK的制造商选择使用-128的十进制文字而不是0x80000000的十六进制文字,这没有什么正当理由。除了在每种情况下,它可能比预期更清楚。

答案 1 :(得分:4)

所有整数文字都有int类型(除非以Ll为后缀)。因此,在第一种情况下,您将int存储到byte中。如果没有强制转换,则不允许这样的缩小转换,除非右侧是常量,如果值在范围内,则允许-128127。但是0b11111111是255,不在范围内。

至于为什么int i = 0b11111111111111111111111111111111被允许:它几乎是“因为JLS这么说”。实际上,该具体示例出现在JLS 3.10.1中。有一个规则是十进制类型int的文字不能超过214743647(特殊情况除外-2147483648),但是没有关于二进制文字的规则,除了它们必须符合32位。

正如我在评论中提到的,第二个问题实际上是关于编写代码的程序员的风格偏好的问题,而且无法回答。