了解Java数据类型

rvi*_*nca 6 java primitive byte types

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

byte b = 0b11111111; // 8 bits or 1 byte
Run Code Online (Sandbox Code Playgroud)

但是这个任务是允许的:

int i = 0b11111111111111111111111111111111; //32 bits or 4 bytes
Run Code Online (Sandbox Code Playgroud)

两种类型都是签名的,我希望b并且i是-1.

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

public static final int   MIN_VALUE = 0x80000000;
Run Code Online (Sandbox Code Playgroud)

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

public static final byte   MIN_VALUE = -128;
Run Code Online (Sandbox Code Playgroud)

Daw*_*ica 6

问题1)

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

问题2)

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

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


ajb*_*ajb 4

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

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

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