问题一:什么是数据类型?
答:顾名思义,就是数据的类型。给你一个数据你要知道它是属于哪一个类型的。
问题二:数据类型是用来干什么的?
答:用来开辟内存空间的。我们研究数据类型其实就是决定存放什么类型的数据。
比如:我们要为人的年龄选择一个数据类型。我们知道,人没有超过两百岁的吧,但是byte类型的范围最大是127,但是目前已知的有140以上的老人,那怎么办呢,那么就可以选择short类型定义变量,那有的人就会问了,可不可以用int呢?可不可以用long类型呢?答案是当然可以,但是我们要知道,为什么规定short类型的出现,因为以前的计算机的内存都很小,所以我们要控制让数据占尽量少的内存,以达到节省内存的目的。而当下,计算机硬件发展迅速,已经有足够的内存供我们使用,所以当我们再次定义年龄变量的时候就更多的会选择int变量,毕竟它的范围比较广。
一,Java数据类型
Java数据类型分成两大类:1.基本数据类型
2.引用数据类型
我们今天聊聊基本数据类型。
下面是各个数据类型的字节数和所占内存
基本数据类型的内存分配情况:
byte在内存中占一个字节,即8位(bit),在内存中由8个0/1组成,由于机器采用二进制,并且第一位为符号位(0表示整数,1表示负数)
1.整型:整型是用来定义整数的关键字
byte: 8 位, 用于表示最小数据单位,如文件中数据,-128~127
short:16 位,很少用,-32768 ~ 32767
int: 32 位、最常用,-2^31-1~2^31 (21 亿)
long: 64 位、次常用
Java整形数据类型的有如下4种表示形式:
十进制整数,例如12,-127,0。
二进制整数,以0b开头,例如0b011 (对应于十进制的3 ) (JDK7.0开始)。
八进制整数,以0开头,例如014(对应于十进制的12)。
十六进制整数,以0x或0X开头,例如0XF(对应于十进制的15)。
2.浮点型:浮点型使用来定义小数的关键字。
float : 单精度类型, 32 位,后缀 F 或 f,1 位符号位,8 位指数,23 位有效尾数。
double:双精度类型, 64 位,最常用,后缀 D 或 d,1 位符号位,11 位指数,52 位有效尾数。
注意:
如此定义float f=1.3;是错误的,1.3默认是double型的。在对float数据进行赋值时,要在数字后面添加f或F,否则Java编译器会认为1.3
是一个double类型的数值,而double不能直接赋值给float类型,所以正确的赋值方式:float f=1.3f;
浮点型数据有两种表示方式:十进制形式,如:3.14
科学计数法形式,如3.14e1 (e后边的数字代表10的指数。)
3.布尔型:又称逻辑类型,只有true和false两个取值,默认初始值为false。
事物往往还有真假之分,比如在判断一件艺术品的时候常说:“这是真的”或“这是假的”。另外还有一些判断性的,比如地铁1号线的首发时间是早上5点吗?这些问题都需要经过判断。但答案只能有两个,要么“是”要么“否”。程序也是一样,有时也需要判断真假,这时就需要一种数据类型,专门用来表示真和假。“boolean”又称布尔,所以我们常说“布尔类型”。boolean是java的关键字,所以字母为小写。
注意:在二进制中Java规定1为真0为假。
4.字符型:字符型采用Unicode编码,区别于c语言的ASC‖码,一个Unicode编码占2个字节(即16位),由于字符型不存在正负之分,所以其表示范围为0至2的16次方-1(0~65535)。
ASC‖码与Unicode编码的区别:
1.两者都是一种编码规范。
2.ASCII是专门用来表示英文字符;而Unicode可以表示所有字符,编码范围比ASCII更大(ASCII可表示255个字符,即1个字节)
3.Unicode编码表与ASC‖码表前127个字符相同。(可以说非常相似。)
两种赋值方式:
1.单引号:例如:char a=‘d’
char a1=‘一’;//char可以储存一个中文,一个中文也占两个字节
char a2=‘\u0061’//代表a字母,可以表示单个字符,格式为‘\uxxxx’,u时约定的前缀,为Unicode的第一个字母。
2.赋值:例如:char b1=97//实际上代表a字母
char b2=65//实际上代表A字母
总结:要么单引号加字母或代码,要么就是不加引号的数字,编译器一经发现就会转换成相应的字母。
5.基本数据类型的转换:
两种方式:自动类型转换和强制类型转换。
1.自动类型转换:即小范围数据可以直接赋值给大范围数据。(顾名思义大范围数据的范围大,把你给包含进去了,所以不用强制转换,Java自动使用隐式类型完成数据类型转换。)
由低到高的线路图如下,
低-------------------------------------------------------------------------------------------------------------------------->高
byte ------------> short/char ------------> int ------------> long ------------> float ------------> double
例子;
float x=100://此时100实际上是一个整型属于int类型,我们知道int的范围比float要小,所以Java执行自动类型转换,转换成了float类型,那么float类型我们知道是用来表示小数的,所以这个时候的x就由整型100变成了浮点型100.0
int x=50;double=y;y=x;//int赋值给double,y的职位50.0与上一道题一样的意思。
2.强制类型转换:即大范围数据不可以直接赋值给小范围数据,这时候要用强制类型转换,即显式类型转换。显示转换格式:(要转换的类型)被转换的值(括号外)。
例子;
int x=(int)23.98//我们知道23.98属于浮点型,浮点型的范围要大于int整型,所以这个时候要进行强制类型转换,所以此时输出x的结果是23
long y=(long)34.98f;//我们知道34.98是浮点型范围还是大于long类型,所以同上一个例子的思路。
byte z=(byte)256;//z的值为0,哎?这是为什么呢,因为呀,我们知道byte的范围是-128到127,而256超出了最大范围,那为什么不是127呢?这个时候就要研究原理,我们int类型256的二进制补码为0000 0000 0000 0000 0000 0001 0000 0000一共是32位,而byte类型的补码最多有8位所以呢,进行了byte的强制类型转换,只能留住32位补码的后八位,即0000 0000所以进项强制类型转换之后,输出z=0。
注意:上边几个例子中,都明显的指出了一个问题,就是经过强制类型转换之后,我们所定义的数据和以前不一样了。所以这就是要指出的问题,强制类型转换会导致数据精度损失或溢出。