Java核心技术卷1-3.3 数据类型(1)

291 阅读5分钟

    Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在Java中,一共有8种基本类型(primitive type),其中有4种整型,2种浮点型、1种用于表示Unicode编码的字符单元的字符类型char(请参见论述char类型的章节)和1章用于表示真值的boolean类型。

注释:Java有一个能够表示任意精度的算术包,通常称为"大数值"(big number)。虽然被称为大数值,但它并不是一种新的Java类型,而是一个Java对象。本章稍后将会详细地介绍它的用法。

3.3.1 整型

    整型用于表示没有小数部分的数值,它允许是负数。Java提供了4种整型,具体内容如表3-1所示。

思考:byte为什么是-128-127?

至于为什么8位是-128~127,是由于最高一位存储符号位,所以剩下7位代表数值大小,能从0表示到127

所以能从-127表示到127,但由于+0和-0都代表0,重复了,所以,多出一个位子,放到负数,让-0代表-128。

所以byte的范围是-128~127。

参考链接:blog.csdn.net/dicong9715/…

    通常情况下,int类型最常用。但是如果表示星球上居住的人数,就需要使用long类型了。byte和short类型主要用于特定的应用场合,例如,底层的文件处理或者需要控制占用存储空间量的大数组。

    在Java中,整型的范围与运行Java代码的机器无关。这就解决了软件从一个平台移植到另一个平台,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题。于此相反,C和C++程序需要针对不同的处理器选择最为有效的整型,这样就有可能造成一个在32位处理器上运行很好的C程序在16位系统上运行却发生了整型溢出。由于Java程序必须保证在所有机器上都能够得到相同的运行结果,所以每一种数据类型的取值范围必须固定。

    长整型数值有一个后缀L(如4000000000L)。十六进制数值有一个前缀0x(如0xCAFE)。八进制有一个前缀0,例如010对应八进制中的8。很显然,八进制表示法比较容易混淆,所以建议最好不要使用八进制常数。

C++注释:在C和C++中,int表示的整型与目标机器相关。在8086这样的16位处理器上整型数值占2字节;在Sun SPARC这样的32位处理器上,整型数值占4字节;而在Intel Pentium处理器上,C和C++整型依赖于具体的操作系统,对于DOS和Windows 3.1,整型数值占2字节。当Windows程序使用32位模式时,整型数值占4字节。在Java中,所有的数值类型所占据的字节数量与平台无关。

注意,Java没有任何无符号类型(unsinged type)

 3.3.2 浮点类型

   浮点类型用于表示有小数部分的数值。在Java中有2种浮点类型,具体内容如表3-2所示。

    double表示这种类型的数值精度是float类型的两倍(有人称之为双精度)。绝大部分应用程序都采用double类型。在很多情况下,float类型的精度很难满足需求。例如,用7位有效数字足以精确地表示普通雇员的年薪,但表示公司总裁的年薪可能就不够用了。实际上,只有很少的情况适用适用float,例如,需要快速的处理单精度数据,或者需要存储大量数据。

    float类型的数值有一个后缀F(例如,3.402F)。没有后缀F的浮点数值(3.402)默认为double。当然,也可以在浮点数值后面添加后缀D(例如,3.402D)。

注释:在JDK 5.0中,可以使用十六进制表示浮点数值。例如,0.125可以表示成0x1.0p-3。

在十六进制表示法中,使用p表示指数,而不是e。注意,尾数采用十六进制,指数采用

十进制。指数的基数是2,而不是10。

    所有的浮点数值计算都遵循IEEE 754规范。下面是用于表示溢出和出错情况的三个特殊的浮点数值:

• 正无穷大

public static final float POSITIVE_INFINITY = 1.0f / 0.0f;

• 负无穷大

public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;

• NaN(不是一个数字)

public static final float NaN = 0.0f / 0.0f;

例如,一个正整数除以0的结果为正无穷大。计算0/0或者负数的平方根结果为NaN。

注释:常量Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY和Double.NaN

(与相应的Float类型的常量一样)分别表示这三个特殊的值,但在实际应用中很少遇到。

特别要说明的是,不能这样检测一个特定值是否等于Double.NaN:

if (x == Double.NaN)// is never true

所有“非数值”的值都认为是不相同的。然而,可以使用Double.isNaN方法:

if (Double.isNaN(x)) //check whether x is "not a number"

警告:浮点数值不适用于禁止出现舍入误差的金融计算中。例如,命令System.out.println

(2.0-1.1)将打印出0.8999999999999999,而不是人们想像的0.9。其主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确的表示分数1/10。这就好像十进制无法精确地表示1/3一样。如果需要在数值计算中不含有任何舍入误差,就应该使用BigDecimal类,本章稍后将介绍这个类。

链接:

Java核心技术卷1-3.3 数据类型(2)