- 1. 数据类型概述
- 2. 数据类型
- 2.1 字符型
- 2.2 整数型
- 2.3 布尔类型
- 2.4 浮点型
- 3. 基本数据类型转化
软件的存在主要是进行数据的处理,现实生活中的数据有很多,所以编程语言对其进行了分门别类,然后就产生了数据类型,不同数据类型的数据会给其分配不同大小的空间进行存储。也就是说,数据类型作用就是决定程序运行阶段给该变量分配多大的内存空间。这就是数据类型的主要作用。
java中的数据类型都包括两大类,一类是基本数据类型,另一类是引用数据类型
其中,基本数据类型又包括4类8种:
● 第1类:整数型(不带小数的数字):byte,short,int,long
● 第2类:浮点型(带小数的数字):float,double
● 第3类:字符型(文字,单个字符):char
● 第4类:布尔型(真和假):boolean
八种基本数据类型指的是:byte、short、int、long、float、double、boolean、char。
八种基本数据类型的详细信息,请看下表:
八种基本数据类型中byte占用1个字节,short占用2个字节,int占用4个字节,long占用8个字节,float占用4个字节,double占用8个字节,boolean占用1个字节,char占用2个字节。
1个字节是8个比特位,1个比特位就是一个1或0,或者说1个比特位就是一个二进制位。也就是说1个字节是由8个1和0组成的二进制数字串。
计算机毕竟是一台通电的机器,电流只有正极、负极,所以只能表示两种情况,也就是1和0。对于一串由1和0组成的数字来说就是二进制,所谓的二进制就是满2进1,请看以下十进制和二进制的对照表:
其实十进制和二进制之间是存在转换规则的,如下所示:
●十进制转换成二进制:比方说十进制数65转换成二进制,我们可以使用短除法,65对2整除商32余数为1,把1写在旁边,接着32对2整除商16余数为0,把0写在旁边,用16整除2商0余数为0,把0写在旁边,这样进行下去直至商为0时为止。然后把余数逆序排列就得到了65的二进制。如下图所示:
二进制转换成十进制:比方说二进制代码为1000001的十进制数是多少呢?可以采用按权相加的方法,对于二进制代码1000001首先从右边第一位起对应2的零次方,第二位对应2的1次方,以此类推,把相应的数位与权值相乘得到的积相加即可,即1×20+0×21+0×22+0×23+0×24+0×25+1×26=65
byte类型的取值范围,为什么最大值只能取到127呢:首先数字是有正负之分,在二进制位当中最左边的二进制位是符号位,0表示正数,1表示负数,byte属于字节型,占用空间大小是1个字节,1个字节是8个bit位,所以byte类型最大值是左边一个0右边七个1:01111111,这个二进制位实际上是27-1,也就是127。byte类型最小值是-128,那么,这也说明1个字节最多可以表示256种不同的情况(-128到127,中间有一个0,共256个不同的数字)。
计算机的容量单位换算:
字符型char在Java语言中占用2个字节,char类型的字面量必须使用半角的单引号括起来,取值范围为[0-65535],char和short都占用2个字节,但是char可以取到更大的正整数,因为char类型没有负数。
Java语言中的char类型变量可以容纳一个汉字。请看以下程序:
public class CharTest01{
public static void main(String[] args){
char c = '中'; System.out.println(c);
}
}
转义字符指用一些普通的字符组合代表一些特殊的字符,由于组合用的字符改变了原意,称为转义字符。Java中的转义字符以 开始,常见的转义字符有:t、n、u、、',",其中t代表制表符,n是换行符,表示一个普通的字符,‘表示一个普通的’,“表示一个普通的”。请看以下代码:
public class CharTest02 {
public static void main(String[] args) {
char c1 = 't';
System.out.println("这是一个普通的字符 = " + c1);
char c2 = 't';
System.out.println("abc" + c2 + "def");
}
}
2.2 整数型
整数型数据在java中有4种表示方式,分别是十进制、八进制、十六进制、二进制。不过要注意的是二进制写法是在Java7中引入的,对于Java7之前的版本不支持该语法。默认为十进制,以0开始表示八进制,以0x开始表示十六进制,以0b开始表示二进制。十进制、八进制、十六进制有什么区别,请看:
十进制:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17…
八进制:0,1,2,3,4,5,6,7,10,11,12,13,14,15,16,17,20,21…
十六进制:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,10,11…
在java语言当中,整数型字面量被当做int类型处理,也就是说在程序中只要遇到整数型的数字,该数字会默认被当做int类型来处理,如果想表示long类型则需要在字面量后面添加L/l,建议大写L,因为小写l和1不好区分。请看以下程序:
public class IntegerTypeTest02{
public static void main(String[] args){
int a = 10;
long b = 10L;
}
}
在以上的代码中int a = 10;表示声明一个int类型的变量a,然后给a变量赋值10,其中10是一个整数型字面值,根据以上规则,10默认被当做int类型来处理,那么int a = 10;就表示int类型的字面量10赋值给int类型的变量a,这个过程是不存在类型转换的。
另外在以上代码中long b = 10L;表示声明一个long类型的变量b,然后给b变量赋值10L,由于10后面添加有L,则编译器会将10L当做long类型来处理,long类型的字面量10L赋值给long类型的变量b,这个过程也是不存在类型转换的。
一个数据在赋值给一个变量的时候存在三种不同的情况,第一种情况是类型一致,不存在类型转换;第二种情况是小容量可以自动赋值给大容量,称为自动类型转换;第三种情况是大容量不能直接赋值给小容量,大容量如果一定要赋值给小容量的话,必须添加强制类型转换符进行强制类型转换操作。不过需要注意的是,强制类型转换在使用的时候一定要谨慎,因为可能会导致精度损失,因为大杯水倒入小杯中,可能会导致水的溢出,不过这也不全都是,也可能精度不会损失,如果大杯中的水很少,这个时候倒入小杯中也可能是不溢出的。就像以上的运行结果,虽然进行了强制类型转换,但并没有损失精度。
4个字节的int类型300强转为1个字节的byte类型,最终的结果是44,这是因为首先int类型的300对应的二进制码是:00000000 00000000 00000001 00101100,强制类型转换的时候会变成1个字节,这个时候底层是将前3个字节砍掉了,也就是最后的二进制码是:00101100,这个二进制码对应的是44。所以精度损失之后的结果就是44了。
当整数型字面量没有超出byte类型取值范围时,可以直接赋值。不过,如果超出了byte类型的取值范围,在使用时必须进行强制类型转换。但需要注意的是强制类型转换会导致精度的损失,例如以上代码中int类型的128强转为byte之后结果是-128(这是因为计算机以二进制补码形式存储数字),还是要谨慎使用。
除了byte类型有这样的规则之外,short和char也具有同样的规则,
Java中的整数型字面量有四种表示方式,但最常用的还是十进制;第二,整数型字面量被当做int处理,如果想当做long处理,需要在后面添加L或l;第三,小容量转换为大容量被称为自动类型转换;第四,大容量转换成小容量称为强制类型转换,强转时需要添加强制类型转换符,但要注意强转可能损失精度;第五,当整数型字面量没有超出byte、short、char的取值范围,可直接赋值。
2.3 布尔类型在Java语言中布尔类型的值只包括true和false,没有其他值,不包括1和0,布尔类型的数据在开发中主要使用在逻辑判断方面
Java语言中boolean类型的数据只有两个值,分别是true和false,没有其他值,并且boolean类型在开发中主要使用在逻辑判断方面。
2.4 浮点型浮点型数据实际上在内存中存储的时候大部分情况下都是存储了数据的近似值
这是因为在现实世界中存在无穷的数据,例如:3.333333333333333333…,数据是无穷的,但是内存是有限的,所以只能存储近似值,float单精度占4个字节,double双精度占8个字节,相对来说double精度要高一些。由于浮点型数据存储的是近似值,所以一般判断两个浮点型数据是否相等的操作很少。
在java语言中有这样的一条规定:只要是浮点型的字面量,例如1.0、3.14等默认会被当做double类型来处理,如果想让程序将其当做float类型来处理,需要在字面量后面添加f/F。
3. 基本数据类型转化基本数据类型之间是存在固定的转换规则的,现总结出以下6条规则,无论是哪个程序,将这6个规则套用进去,问题迎刃而解:
八种基本数据类型中,除boolean类型不能转换,剩下七种类型之间都可以进行转换;
如果整数型字面量没有超出byte,short,char的取值范围,可以直接将其赋值给byte,short,char类型的变量;
小容量向大容量转换称为自动类型转换,容量从小到大的排序为:byte < short(char) < int < long < float < double,其中short和char都占用两个字节,但是char可以表示更大的正整数;
大容量转换成小容量,称为强制类型转换,编写时必须添加“强制类型转换符”,但运行时可能出现精度损失,谨慎使用;
byte,short,char类型混合运算时,先各自转换成int类型再做运算;
多种数据类型混合运算,各自先转换成容量最大的那一种再做运算;



