Java开发笔记(五)数值变量的类型
如今个人电脑的配置越来越高,内存和硬盘的容量大小都是以G为单位,而1G=1024M=1024*1024K=1024*1024*1024字节。不过在PC的早期发展阶段,电脑的存储空间却是十分有限的,像2000年前后广泛使用的3.5寸软盘,其存储容量只有区区1.44M,当时流行的SDR内存容量也才32M和64M。所以早期的编程语言很注重节约存储,给每个变量分配内存都要精打细算,大环境如此,于是早在1996年诞生的Java语言也不例外,仅仅是处理整数和小数,就分成了byte、short、int、long、float、double六种数字类型。下面简要介绍一下这六种类型的数值表示范围。
1、byte:字节型。该类型的变量只占用一个字节大小,一个字节可表达八位的二进制数,因为八位的第一位是符号位,为0时表示当前是正数,为1时表示当前是负数,所以byte类型实际囊括的数值范围是-128到127。其中00000000到01111111表示了0到127区间,而10000000到11111111表示了-128到-1区间。需要注意的是,Java使用补码表示二进制数,且正数的补码与其原码相同,但负数的补码是在其反码的末位加1(负数的反码是正数)。因此假设某负数为x,若令“x取反+1=10000000”,则求得“x=(10000000-1)再取反=01111111取反=10000000”,即x=-128;若令“x取反+1=11111111”,则求得“x=(11111111-1)再取反=11111110取反=00000001”,即x=-1。
2、short:短整型。该类型的变量占用两个字节大小,可表达的数值范围是-32768到32767,即负2的15次方~2的15次方-1。
3、int:整型。该类型的变量占用四个字节大小,可表达的数值范围是-2147483648到2147483647,即负2的31次方~2的31次方-1。
4、long:长整型。该类型的变量占用八个字节大小,可表达的数值范围是-9223372036854775807到9223372036854775808,即负2的63次方~2的63次方-1。
5、float:浮点型,用来表示小数。该类型的变量占用四个字节大小,它包括一个符号位、一个8位的指数和一个23位尾数,此时1+8+23=32位=4字节。浮点数的计算公式为:正/负*(2的指数次方)*尾数,其中正/负由符号位决定,8位指数的表示范围是-128到127,尾数表示一个介于1.0和2.0之间的小数。这样float类型可表示的整数部分范围横跨正负3.402823乘以10的38次方,小数部分范围低至1.401298乘以10的负45次方,虽然看起来浮点数的表示位数大大增加,但是有效数字只有6到7位,也就是说,开头6到7位才是精确的数字,后面的数字统统不准。
6、double:双精度型,用来表示小数。该类型的变量占用八个字节大小,它包括一个符号位、一个11位的指数和一个52位尾数,此时1+11+52=64位=8字节。double类型可表示的整数部分范围横跨正负1.797693乘以10的308次方,小数部分范围低至4.9000000乘以10的负324次方,并且有效数字提高到了15到16位。跟double双精度相比,float类型的有效位数明显不够,于是浮点数也被称作单精度数。
对于实际开发来说,byte和short类型可表达的整数范围太小,同时现在电脑的存储容量毫不在乎几个字节的差异,因此这两个类型在Java编程中基本无用武之地。int类型可以表示高达21亿的整数,能够应付大部分的整数运算场景,故而Java编码中的整数变量最常使用int类型。至于long类型可表示多达19位的十进制数,常用于int类型覆盖不到的整数场合,比如世界人口数量80亿必须通过long类型来存储。小数计算方面,因为float类型的数字精度不够准,所以小数变量更常使用double类型来处理。
有了这些基本的数值类型,就能声明相应类型的变量了,声明语句的格式为“变量类型 变量名称;”。如果在声明变量之时就进行初始赋值,则声明语句的格式为“变量类型 变量名称 = 具体的数值;”。下面是个声明数值变量的代码例子,其中包含了先声明再赋值、以及声明时即刻赋值的两种情况:
public class Basic { public static void main(String[] args) { int zhumulanma; // 先声明变量 // 8844是2005年中国测量得到的珠穆朗玛峰岩面高度,8848是冰雪高度 zhumulanma = 8844; // 再对变量赋值 System.out.println("珠穆朗玛峰的高度="+zhumulanma); double yuanzhoulv = 3.1415926; // 在声明变量之时就进行初始赋值 System.out.println("圆周率="+yuanzhoulv); } }
上述代码的运行结果如下图所示。