Java 的数据类型有自己的特点,有的地方可能和自己认为的不大一样,所以有必要记一下。
整形
整形的四种类型以及它们的占位、表数范围如下表:
类型 占位(bit) 范围 byte 8 -128~127 short 16 -32 768~32 767 int 32 -2 147 483 648~2 147 483 647 long 64 -9 223 372 036 854 775 808~9 223 372 036 854 775 807
- 当直接把一个较小的整数常量赋给一个 byte 或 short 变量,系统会自动把这个整数常量当成 byte 或者 short 类型来处理。
- 如果使用一个巨大的整数常量(超出了 int 类型的表数范围)时,Java 不会自动把这个整数常量当成 long 类型来处理。如果希望系统把一个整数变量当成 long 类型来处理,应在这个整数常量后增加 l 或者 L 作为后缀。通常推荐 L,因为字母 l 很容易跟数字 1 搞混。
二进制整数
在 Java 7 中可以使用 0bxx 来表示二进制整数,需要注意的是这里的二进制就是这个数字真正的二进制表示,比如写负数的时候要写出负数的补码。类型确定数字的长度确定,符号位也确定。如下:
byte b = 0b01111111; // b = 127
byte c = (byte)0b11111111; // c = -1
byte d = -0b1; // d = -1
可见,Java 并未希望人们用这种方法来表示补码。
但是转过来说,可能是因为 byte 太短的缘故,那换 short, int 和 long 来分别试试。最终的结果如下:
short s = (short)0b1111111111111111;
int i = 0b11111111111111111111111111111111;
long l = 0b1111111111111111111111111111111111111111111111111111111111111111L;
最终结果所见是这样的,在 byte 和 short 那边 Java 宁可选择了相信它是大一点的数字也不肯相信它是一个负数,或者说是因为 Java 内部的处理机制来决定的。