1.2.1 有符号整数类型
有符号整数类型适用于没有小数部分的数,可以是负数。Java提供了4种有符号整数类型,如表1-1所示。
表1-1 Java中的有符号整数类型
注意:常量Integer.MIN_VALUE与Integer.MAX_VALUE分别是int类型的最小值和最大值。此外,Long、Short和Byte类也分别都有MIN_VALUE和MAX_VALUE常量。
在大多数情况下,int类型是最实用的。但是如果想表示整个地球的居住人口数量,就需要使用long类型了。byte和short类型主要用于特定的应用场合,例如,底层文件处理,或者存储空间有限的大数组。
注意:如果long类型依然不够,那么可以使用BigInteger类。参见1.4.6小节了解详细信息。
在Java中,整数类型的范围不取决于运行程序的机器。毕竟,Java是被设计为“一次编写,处处运行”的语言。相比之下,C和C++程序中的整数类型的大小还取决于编译该程序的处理器。
可以使用后缀L来表示长整型字面量(例如,4000000000L)。但是,byte类型或short类型的字面量无法通过后缀区分。这时需要使用强制转换符号(参见1.4.4小节)。例如,(byte)127表示byte类型。十六进制字面量具有前缀0x(例如,0xCAFEBABE)。二进制数值具有前缀0b,例如,0b1001是9。
警告:八进制数值具有前缀0,例如,011是9。但这样的形式可能会容易混淆,因此最好远离八进制字面量和0开头的数值。
你可以在数字字面量中添加下划线进行长数字的分组,例如,使用1_000_000(或0b1111_0100_ 0010_0100_0000)来表示100万。但这里的下划线仅仅是为了让人更易阅读,Java编译器会删除它们。
注意:如果使用的整数值永远不会是负数,并且确实需要一个额外的数位来存储数据,那么可以将有符号整数值解释为无符号数,但是需要非常仔细。例如,一个byte类型的值b的表示范围通常是−128~127。如果想表示0~255的范围,仍然可以将其存储在byte类型中。由于二进制算术运算的性质,如果不发生溢出,那么加法、减法和乘法都是可以正常工作的。对于其他运算,可以调用Byte.toUnsignedInt(b)来获得0~255的int类型的值,然后就可以处理整数值,并将结果强制转换回byte类型。Integer和Long类也有用于处理无符号数的除数和余数的方法。