Data Type
在程序执行中需要存储和运算很多的信息,这些信息可能是用户输入,文件读取,程序设定或者网络中取得的。这些信息在程序中透过变量(“variable”)进行存储,以供程序的随取随用.
一个变量指向一块内存空间,这样使用变量名来存取数据比直接使用内存地址来操作方便的多.然而数据在存储时所需要的内存大小是不同的,不同的数据必须配以不同的空间来存储,在java中对不同的数据区分有几种不同的”数据类型”(Data Type).
由于java是一种强类型语言,这意味着所有的variable必须要有类型声明.在java中定义了8中基本的数据类型。其中4种是整数类型,2种浮点数类型,一种字符型(char),一种布尔类型(boolean).
整数:
l byte(字节)
java提供了byte数据类型用来存储位元(bit)数据,例如图片,电影等.一个字节占8个bit,有必要的话byte也可以存储整数类型.
l short(短整数)
小型的整数,占2个字节.
l int(整数)
java的默认整数类型,占4个字节:也就是说一般的数字都看成int型,例如:
short s = 4 + 4;
s = (short)(s + s);//一定要转型
一般int类型是程序中最实用的整数类型,但是有些特殊的专业要求就会用到其它的数据类型.例如:统计全球的人口就要用long类型了,游戏中为了节约网络资源使用byte传输.
l long(长整数)
java中的长整型占8个字节,表示数值量很大的整数.一般使用L(大小写都可以)作为后缀,标识数字是一个long类型.以前有人问我这么一个问题:
System.out.println(“12345+5432l”);
System.out.println(“12345+5432”);
为什么打印出来都是”17777”?
我直接就告诉他5432l最后一位是字母”l”不是数字”1”.我又告诉他5432l是一个long类型的数字,他非要说是int类型,怪不得他找了半天没发现..
整数是表示没有小数点的数字,java中没有非负整数,二进制表示时最高位以1开头的所数字都是负数,而最高位以0开头的所有数字表示整数.
Type | 存储空间 | Range(min ~ max) |
byte | 1 bytes | -128 ~ 127 |
short | 2 bytes | -32768 ~ 32767 |
int | 4 bytes | -2147483648 ~ 2147483647 |
long | 8 bytes | -9223372036854775808 ~ 9223372036854775807 |
数字类型中的前缀和后缀:在java中没有直接申明一个int类型为二进制的方法,因为二进制表示数字太长了,而且很麻烦.java默认都是十进制的,但是有表示八进制和十六进制办法,那就是在数字的前面加上前缀:加上0x表示数字为16进制的,加上0(“零”)表示数字为8进制的.因为8进制的前缀是数字0容易混淆,所以不建议使用.
例如:System.out.println(088);是错误的,而
System.out.println(010);
System.out.println(0x10);
输出:
8
16
在Java中,整数类型的范围不取决于你运行Java代码的机器。这避免了将软件在两个平台或者在同一平台上的两个操作系统之间转移而带来的主要麻烦。与之相反的是,C和C++程序对每个处理器使用最有效的整数类型。造成的结果就是,一个C程序在一个32位处理器上运行良好而在一个16位系统中可能表现出整数溢出。因为Java程序必须保证在所有的机器上运行得到相同的结果,不同类型的范围是固定的。在C和C++中,int表示的整数类型取决于目标机。在16位处理器上,例如8086机,整数占用2字节。在32位处理器,例如Sun公司的SPARC,整数占用4字节。在Intel奔腾上,C和C++的整数类型取决于操作系统:对于DOS和Windows3.1,整数是2字节。当Windows程序使用32位模式时,整数占用4字节。在Java中,一切数字类型的大小都是平台无关的。注意,Java没有任何无符号类型。
浮点数:
l float(浮点数)
称为浮点数(有小数点的位置可以改变的数字),为了和double对应又称为单精度浮点数,占4个字节.
l Double(双精度浮点数)
所占空间是float的两倍,占8个字节.大多数应用程序都选择double类型。float有限的精度对于很多情况是不足的。从JDK5.0起,可以指定十六进制的浮点数.例如,0.125就等同于0x1.0p-3,(p-3表示基数为2的-3次方即:2^(-3),如果是e-3的话表示是基数为10的-3次方,但不能0x1.0e-3这样写)
System.out.println(0x1.0p-3); 》》 0.125.
---------------------------------------------
引用:
http://wenwen.soso.com/z/q115973240.htm?rq=116038707&ri=1&uid=0
拿 0.125e0 和 0x1.0p-3 来说明
0x 表示这是一个 16 进制数
0x 和 p 之间的 1.0 表示尾数部分, 即十进制表示法中的 0.125
p 后的 -3 表示指数部分, 对应十进制表示法中的 0
再对应书上说的尾数和指数的进制, 就可以得到最后 0x1.0p-3 = (0x1.0)*(2^-3) = (0x1.0)*(0.125) = 0.125
假如用 n.m 来表示尾数, k 表示指数, 则 0x[m.n]p[k] (方括号是用来分隔用, 实际上没有) 转为十进制则是 (0x[m.n])*(2^k), 注意要把 0xm.n 转为十进制
-----------------------------------------------
Java中float可以使用F后缀结尾,double可以使用D结尾.
要很好的了解浮点数就必须了解一下IEEE标准.
可以参考一下网址:
http://baike.baidu.com/view/1388812.htm
http://stephensuen.spaces.live.com/Blog/cns!1p1G_DGhjYiYGmj6keNZQAcw!172.entry
很好的一例子:
用十六进制表示为 0xC0B40000,并且我们知道它实际上是一个单精度的浮点数。为了得到该浮点数实际表达的实数,我们首先将它变换为二进制形式:
C 0 B 4 0 0 0 0
1100 0000 1011 0100 0000 0000 0000 0000
接着按照浮点数的格式切分为相应的域:
s e m
1 10000001 01101000000000000000000
符号域 1 意味着负数;指数域为 129 意味着实际的指数为 2 (减去偏差值 127);尾数域为 01101 意味着实际的二进制尾数为 1.01101 (加上隐含的小数点前面的 1)。所以,实际的实数为:
-1.01101 × 22
-(20 + 2-2 + 2-3 2-5) × 22
-5.625
注意:浮点数不适用于禁止出现舍入误差的金融计算中.例如:
System.out.println(2.0-1.1)将打印出0.899999999999,而不是0.9。出现这种问题的原因是浮点数值是采用二进制系统表示的,而在系统中无法精确的表示分数1/10。
① 需要在计算中不含有任何舍入误差,就应该使用BigDecimal类。并且使用参数为String的构造方法。
② 将一个类标记为strictfp ,那么这个类中的所有方法都要使用严格的浮点数计算.
③ 将一个方法标记为strictfp,那么这个方法就会使用严格的浮点数计算.
字符:
l char(字符)
要理解char类型,你需要了解Unicode编码规则。Unicode是为克服传统字符编码规则的局限性而发明的。在Unicode之前,有许多标准:美国的ASCII、西欧语言的ISO 8859-1、俄语使用的KOI-8、中文使用的GB18030 和 BIG-5等等。这造成了两个问题。一个特定的码值在不同的编码规则中对应于不同的字母。此外,大字符集的语言使用的编码具有可变的长度:一些普通的字符以单字节编码,而其余的需要两个或更多字节。
我们强烈建议在程序中避免使用char类型,除非你对UTF-16代码单元十分熟练。你几乎总是将字符串视为抽象数据类型即可。
char类型也可以进行计算 例如:char c = 4 + 4;
要了解java中所有的char位置关系可以运行:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class PrintAllChar {
public static void main(String[] args) throws IOException {
File f = new File(PrintAllChar.class.getResource(".").getPath() + "allChar.txt");
f.createNewFile();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f)));
for(char i = 0; i < Character.MAX_VALUE; i ++){
bw.write(i);
bw.write("/t" + Integer.toHexString(i) + "/n");
}
bw.flush();
bw.close();
}
}
如果把dos下属性的字体调大就会出现这个问题,我试了一下,dos属性 -》字体 默认的是8x16 ,把这个值改大,'/u0000' 显示的就是小写的 a。把字体改小一点就不会显示了。
参考:
http://x-spirit.spaces.live.com/blog/cns!CC0B04AE126337C0!289.entry
http://www.regexlab.com/zh/encoding.htm
布尔类型:
l boolean
boolean类型有且只有两个值,false和true。这是用来判断逻辑条件的。你不能在整型和布尔型之间进行转换。
在C++中,数字乃至小数点都被用于替代布尔值。0值就相当于布尔值false而非0值相当于true。Java中并非如此.
- DataTypeMaxMin.java
public class DataTypeMaxMin {
public static void main(String[] args) {
System.out.printf("short range: %d ~ %d/n",
Short.MAX_VALUE,
Short.MIN_VALUE);
System.out.printf("int range: %d ~ %d/n",
Integer.MAX_VALUE,
Integer.MIN_VALUE);
System.out.printf("long range: %d ~ %d/n",
Long.MAX_VALUE,
Long.MIN_VALUE);
System.out.printf("byte range: %d ~ %d/n",
Byte.MAX_VALUE,
Byte.MIN_VALUE);
System.out.printf("float range: %e ~ %e/n",
Float.MAX_VALUE,
Float.MIN_VALUE);
System.out.printf("double range: %e ~ %e/n",
Double.MAX_VALUE,
Double.MIN_VALUE);
}
}
short range: 32767 ~ -32768
int range: 2147483647 ~ -2147483648
long range: 9223372036854775807 ~ -9223372036854775808
byte range: 127 ~ -128
float range: 3.402823e+38 ~ 1.401298e-45
double range: 1.797693e+308 ~ 4.900000e-324