coding……
但行好事 莫问前程

Java编程拾遗『Java基本数据类型』

Java是一种强类型的语言,这就意味着必须为每一个变量声明一种变量类型。在Java中,一共存在8种基本数据类型,其中4种整型、2种浮点型、1种用于表示Unicode编码的字符单元的自负类型char和一种用于表示真值的bollean类型。

1. 数据类型

1.1 整型

类型 大小 取值范围
byte 1字节 -128 ~ 127
short 2字节 -32 768 ~ 32 767
int 4字节 -2 147 483 648 ~ 2 147 483 647(正好超过20亿)
long 8字节 -9 223 372 036 854 775 808 ~  9 223 372 036 854 775 807

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

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

1.2 浮点类型

类型 大小 取值范围
float 4字节 大约±3.402 823 47E + 38F(有效位数为6~7位)
double 8字节 大约±1.797 693 134 862 315 70E + 308(有效位数为15位)

float类型的数值有一个后缀F(例如3.14F),没有后缀F的浮点数值(例如3.14)默认为double类型。在JDK5中,可以使用十六进制表示浮点数值。例如0.125可以表示为0x1.0p-3,其中p表示指数,尾数采用十六进制,指数采用十进制,指数的基数是2,所以0x1.0p-3表示1.0 * 2^-3。

另外要注意的是,浮点数不适用于禁止出现舍入误差的金融计算中。例如,命令System.out.println(1.0 – 0.1)将打印出0.899999999999,而不是0.9。主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确表示分数1/10。就好像十进制系统无法精确的表示1/3一样。如果需要在计算数值中不包含任何舍入误差,就应该使用BigDecimal类。

1.3 char类型

char类型用于表示单个字符,通常用来表示字符常量,比如’A’表示Unicode编码为65所对应的字符常量。另外Unicode编码单元可以表示为十六进制,范围从\u0000到\uffff,例如:\u2122表示注册符号(™)。

除了可以使用转义序列符\u表示Unicode代码单元的编码之外,还有一些用于表示特殊字符的转义字符,如下:

转义字符 名称 Unicode值
\b 退格 \u0008
\t 制表 \u0009
\n 换行 \u000a
\r 回车 \u000d
\” 双引号 \u0022
\’ 单引号 \u0027
\\ 反斜杠 \u005c

Java中char字符占两个字节,这也是为什么一个字符可以表示一个中文汉字的原因。想了解编码的同学可以去看一下这篇文章深入分析 Java 中的中文编码问题 

1.4 boolean类型

boolean(布尔)类型有两个值,true和false,用来判断逻辑条件。整型数值和布尔值不能相互进行转换。java规范中,没有明确指出boolean的大小。在《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。

2. 数值类型之间的相互转换

以上提到的四种数据类型,除了boolean类型外,之间都可以相互转换。在程序运行时,经常需要将一种类型转换成另一种类型。类型之间的转换又可以分为自动类型转换和强制类型转换。

2.1 自动类型转换


上图中5个实心箭头表示无信息丢失转换,3个虚箭头表示可能会有精度损失。例如123 456 789为一个大整数,它所包含的位数比float类型所能表达的位数多。当这个整型类型转换为float类型时,将会得到同样大小的结果,但却损失了一定的精度。当使用上面两个数值进行二元操作时(如 n + f,n是整数,f是浮点数),先要将两个操作数转换为同一种类型,然后再进行计算。

  • 如果两个操作数中有一个是double类型,另一个操作数就会转换成double类型
  • 否则,如果其中一个操作数是float类型,另一个操作数就会转换成float类型
  • 否则,如果其中一个操作数是long类型,另一个操作数就会转换成long类型
  • 否则,两个操作数都将被转换成int类型

2.2 强制类型转换

上节可以看出,在一些场景,可以进行自动类型转换,比如int类型可以自动转换成float类型。但是在开发中,有时候也需要将float类型转换成int类型,根据上述转换规则,这个转换是不能自动完成的。在Java中允许这种类型的转换,但是,有可能回损失一些精度信息。这种情况下,需要通过强制类型转换实现这个操作。比如:

double x = 9.997;
int nx = (int) x; //nx is 9

上述强制类型转换截断了double的小数部分,转换为整形。

注意:

  • 如果试图将一个数值从一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。比如(byte)300的实际值为44。
  • boolean类型不能与任何类型进行强制类型转换

赞(0) 打赏
Zhuoli's Blog » Java编程拾遗『Java基本数据类型』
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址