Java基本数据类型

Java中的数据类型分为基本数据类型(primitive type)和引用数据类型。

  1. 基本数据类型共有8种:4种整型,2种浮点型,1种用于表示Unicode编码的字符单元的字符类型char和1种用于表示真值的boolean类型。
  2. 引用数据类型分为:类,接口,数组。

这篇文章主要叙述基本数据类型。

# 整型

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

类型 存储需求 取值范围
byte 1字节 – 128 ~ 127
short 2字节 – 32 768 ~ 32 787
int 4字节 – 2 147 483 648 ~ 2147 483 647 (正好超过20亿)
long 8字节 – 9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807

以byte类型为例,描述下最大值和最小值的取值,其余整型类似。

byte有8位(其中第一位表示符号位,0为正数,1为负数),总共可以表示256(28)个数,分为正负两块的话,就是0 ~ +127和-1 ~ -128各128个数。

最大值为 0111 1111,结果是27-1=127

最小值为 1000 0000,结果是-128

长整型数值后有一个后缀L,比如:4000000000L。如果这样定义: long num = 4000000000; 那么编译器就会报错:The literal 4000000000 of type int is out of range。由此看出如果声明的整型数字不带有类型后缀的话,它默认就是int类型的,如果是合法的int类型,那它会再次在long num = 某个值的时候转为long类型。所以正确的做法应该是: long num = 4000000000L; 

在Java中可以使用二进制(自Java 7后),八进制和十六进制表示整数。

在数值前加前缀:

0b表示二进制数值: int x = 0b1001; //9 

0表示八进制数值: int x = 010; //8 八进制容易混淆,不建议使用。 

0x表示十六进制数值: int x = 0xCAFE; //51966 

从Java 7开始,还可以为数字字面量加下划线,如用1_000_000(或0b1111_0100_0010_0100_0000)表示一百万,这些下划线只是为了让人们方便阅读,Java编译器会去除这些下划线。

 

# 浮点型

浮点型用于表示有小数部分的数值。在Java中有2种浮点类型,如下所示。

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

double表示这种类型的数据精度是float类型的两倍,也称之为双精度。

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

有三个特殊的浮点数值表示溢出和出错的情况:正无穷大、负无穷大、NaN(不是一个数字)。

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

常量Double.POSITIVE_INFINITY,Double.NEGATIVE_INFINITY和Double.NaN分别表示这三个特殊的值,对应Float的三个值名称也一样,实际应用中很少用到。

需要注意的是,不能使用 if(x == Double.NaN) 来检测一个特定值是否等于Double.NaN,所有“非数值”(即对象)的值都认为是不相等的,这个表达式会认为所有非Double.NaN的值是应该使用 if(Double.isNaN(x)) 来检测x不是一个数值。 

注意,浮点数值不适用于禁止出现舍入误差的金融计算中,应该使用BigDecimal类

 

# char类型

在Java中,char类型是16位的Unicode字符集,采用UTF-16编码。其值介于’\u0000′ (or 0) 和 ‘\uffff’ (or 65,535 inclusive)之间。

Unicode标准中,将代码点(编码表中某个字符对应的代码值,比如:U+FFFF)分为17个代码级别。第一个代码级别称为基本的多语言级别,代码点从U+0000到U+FFFF,其余的16个附加级别,代码点从U+10000到U+10FFFF,其中包括了一些辅助字符。

UTF-16编码中采用不同长度的编码表示所有的Unicode代码点。在基本的多语言级别中,每个字符使用16位表示,通常被成为代码单元;而辅助字符采用一对连续的代码单元进行编码。比如对于代码点U+1D56B,其编码方式是采用两个代码单元来编码:U+D835和U+DD6B。

由于char类型是16位(一个代码单元),所以在采用UTF-16编码的情况下,只能用来表示基本的多语言级别。而后面的代码级别因为要采用两个代码单元而表示不了。所以char的最大值也就是Unicode第一个代码级别的最大值。这也是为什么 char c = '\u1D56B'; 为什么会编译报错的原因。

 

# boolean类型

boolean类型只有两种类型true或者false,只有1位。 

 


参考资料:

1、Java核心技术 卷I 3.3数据类型

2、http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

 

posted @ 2015-09-06 22:12  HowieChih  阅读(317)  评论(0编辑  收藏  举报