java核心技术学习笔记(二)—基本数据类型总结

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

java整型共有四种,分别是int(占4字节)、short(占2字节)、long(占8字节)、byte(占1字节),1字节有8位。另外,因为Java没有任何无符号类型(unsigned type),所以最高位永远是表示符号的(正负),所以各个整型的范围的计算公式是:
这里写图片描述
例如byte占一个字节,就是八位,除掉最高一位符号位,最大能表示的二进制数就是0111 1111(java中最高位是0表示正数),即从2的0次方累加到2的6次方,等于127(2的7次方-1)。

要说byte类型能表示的最小负数,还得说一下java负数的计算方式。计算机中,数都以补码的形式存放,正数的补码是其本身,负数的补码是其绝对值取反加1。另外需要注意的是,正数的最高位一定是0,这样取反才能得到1,即得到负数。例如byte类型的-3的二进制表示是这么计算来的:取绝对值为3,表示为二进制(byte类型8位)就是0000 0011(前面的0一定要补上),取反就是1111 1100,再加一就是1111 1101,这串二级制码表示的就是负3。同样的方式,可以计算byte类型(8位)能表示的最小整数:

1000 0000 -128  
1000 0001 -127  
……
1111 1110 -2  
1111 1111 -1  

所以,byte能表示的最小整数是-128(2的7次方)。
当然,还能以更简便的方式得到各种整数类型的范围,那就是利用基本类型的封装类,byte类型对应Byte类,int对应Integer等,可以使用

public class Welcome {
    public static void main(String[] args) {
        System.out.println("最小值:Byte.MIN_VALUE=" + 
        Byte.MIN_VALUE);  
        System.out.println("最大值:Byte.MAX_VALUE=" + 
        Byte.MAX_VALUE); 
    }
}

直接得到最大值和最小值,其他类型也可以通过同样的方式获取。

在java中,整型的范围与运行java代码的机器无关,由于java程序必须保证在所有机器上都能够得到相同的运行结果,所以每一种数据类型的取值范围必须固定。与此相反,C和C++程序需要针对不同的处理器选择最为有效的整数,这样就有可能造成一个在32位处理器上运行很好的C程序,在16位系统上运行却发生整数溢出。

long类型的数值有一个后缀L(如400L)

整数可以使用十进制,十六进制,二进制和八进制表示。十六进制数值有一个前缀0x,例如0xCAFE(十六进制数使用0~9和A~F表示,A代表10,F代表15),八进制有一个前缀0,例如,010,因为八进制很容易混淆(010看起来就很像二进制,但是java是不支持显示二进制表示的),所以建议最好不要使用八进制常数。

各个进制之间的换算如下:十六进制的一位相当于二进制的四位(二级制4位最大表示15),八进制的一位相当于二进制的三位(二进制三位最大表示7),例如十六进制0xA(A表示10)相当于二进制1010。八进制012相当于二进制1010。而二进制和十进制之间的转换为2的n次方的累加,n从0开始,例如二级制0000 1010 对应的十进制是
这里写图片描述

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

在JDK5.0中,可以使用十六进制表示浮点数值,例如0.125可以表示成0x1.0p-3。在十六进制表示法中,使用p表示指数,而不是e,注意,位数采用十六进制,指数采用十进制,指数的基数是2,而不是10.

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

  1. 正无穷大
  2. 负无穷大
  3. NaN(不是一个数字,not a number)
    需要注意,整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或者NaN结果。
    常量Double.POSITIVE_INFINITY,Double.NEGATIVE_INFINITY,Double.NaN,分别对应这三个特殊的值,但是实际应用中很少遇到,不能这样检测一个特定值是否等于Double.NaN
if (x == Double.NaN ) //永远不会是true

所有“非数值”都被认为是不相同的。然而可以使用

if (Double.isNaN(x) )

检测x是不是非数值。

浮点数值不适用于进制不允许出现舍入误差的金融计算中。例如命令

System.out.println(2.0 - 1.1);

输出:0.8999999999999999,而不是期待的0.9,其主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确地表示分数1/10。就好像十进制无法表示1/3一样。如果需要在数值计算中不含有任何舍入误差,就应该使用BigDecimal类。

char类型用于表示单个字符。通常用来表示字符常量。java采用Unicode编码,例如\u03C0表示字母π(转义字符\u表示Unicode码表),转义字符\u还可以出现在字符常量或者字符串的引号之外(其他所有转义序列都不行)。例如

public static void main(String\u005B\u005d args) //表示[]

所以要弄清char类型,就必须弄清Unicode编码表,但是在此不再赘述,可以Google一下Unicode编码、代码点、基本的多语言级别、代码单元这些词。

在Java中,char类型用UTF-16编码描述一个代码单元,我们强烈建议不要在程序中使用char类型,除非确实需要对UTF-16代码单元进行操作(因为有些字符需要使用两个代码单元表示,如果使用char的话进行字符操作的时候容易出现问题–一不小心就会取出半个字符)。

与其他大多数程序设计语言相比,Java中“字母”和“数字”的范围要大。字母包括’A’~’Z’、’a’~’z’、’_’或在某种语言中代表字母的任何Unicode字符,同样,数字包括’0’~’9’和在某种语言中代表数字的任何Unicode字符。要想知道哪些Unicode字符属于java中的‘字母’,可以使用Character类的下列两个方法检测:

Character.isJavaIdentifierStart('f');
Character.isJavaIdentifierPart('f');
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值