Java中各个基本数据类型之间的转换的细节问题。

129 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

前言

首先要了解一门语言肯定要先了解这门语言的基本数据类型是什么,了解了数据类型之后,我们就可以设置不同类型的变量,来实现我们想要达到的各种目的以及继续后续的学习。

八种基本的数据类型

java中的数据类型分为八种,每种数据类型所设置的变量在内存空间中占有不同的字节。通过下面这张图片可以分别看出所占的字节大小。而学过计算机组成原理这门课程后,我们会知道一个字节表示8bit。一个bit表示二进制中的一个数位。所以一个字节的最多存储长度就是256,共有2^8=256 种可能性。也就正对应着byte的存储范围:-128~127。而其他基本数据类型同理: 因为char 没有负值,但又占两个字节,所以取值范围是0~2^16-1(65535)

image.png

类型转换

各个类型之间从高到低可以进行转换,但从低到高并不支持转换,需要一些方法。比如说要从int转为short类型,那么我们知道int设置的变量是四个字节,而short只有两个字节。他们之间的内存空间分配大小明显不同。所以我们无法自然的从低字节的分配空间转向高字节的分配空间,但是可以从高字节的分配空间转到低字节的分配空间,也就是舍弃一部分空间。这可能会造成内存溢出的问题!!!

注意:char不能和byte或short进行相互转换!

浮点类型

浮点数=符号位+指数位+尾数位,因为尾数位可能会丢失,造成精度损失,所以小数也可以叫做近似值!java中的浮点类型默认为Double类型。所以当我们写float a = 1.1;时程序会说无法从Double转为float,会造成精度损失。而这时候的解决办法有两种,一种为强转换法,就是不考虑精度损失(但要小心内存溢出!),float a = (float)1.1;强行将1.1赋值给float类型的变量a。另一种就是使1.1默认为float类型,float a = 1.1f;(这里f写为F也可以),这种表示1.1float类型。

浮点数的使用陷阱:关于浮点类型还需要注意一点:通过给Double类型变量赋值和通过运算之后给Double类型变量赋值是两个不同的结果。比如下面的例子

public static void main(String[] args) {
    Double a = 2.7;
    Double b = 8.1 / 3;
    System.out.println(a);
    System.out.println(b);
    System.out.println(a == b);
}

image.png

不难看出,a和b输出的值并不相同。那么这是为什么呢?明明都应该是2.7才对。其实是计算机并不知道这个数值运算什么时候会结束,他不能像人的数学运算一样,算过之后已经知道小数点后边全是0.但是计算机认为后边可能还会有数值,类似于你运算结果8.000000000001。计算机认为有可能0的后方还有数值。所以就取了近似值,所以小数都可以认为是一个近似值。

字符类型

char可以表示单个字符,但因为char类型占有两个字节,而汉字恰好也占有两个字节大小。所以一个char类型变量刚好可以存储一个汉字。每一个字符都是有对应的数值,并且这些数值都是通过二进制方式进行存储。下面看例子:

public static void main(String[] args) {
    char result1 = 'a';
    char result2 = 97;
    System.out.println("result1=" + (int)result1);
    System.out.println("result2=" + result2);
}

image.png 一个字母字符转为int类型后会对应一个值,而用int类型赋值给char会直接转为字符a。这是因为每一个字符都在unicode码中有对应的编码,a的二进制编码就是(0110 0001)。所以在java中char的本质是一个整数,在输出时会按照对应的unicode字符输出。字符和码值对应关系是通过字符编码表决定的(是规定好的)。ASCII编码表,由一个字节表示,但最初的设置者只用了128个字符,因为只有26个英文字母和其余一些特殊符号。但由于计算机的普及,所有国家都开始发展并使用。仅仅容纳256个字符根本不够,并且一个汉字就占了2位。自然就诞生了unicode编码表后续又因为浪费空间,最终改进为现在我们常用的UTF-8编码表(字母占一个字节,汉字占三个字节)。不仅字符有对应的整数值,每个汉字也有对应的一个整数值。

注意:在java中,short和byte的转换默认都为int类型赋值。

image.png 程序会进行报错,提示你无法进行int向byte的转换。解决办法就是进行强转换。

布尔类型

在java中表示真与假只能用true和false不能像C语言一样用1和0表示!

强转换符号只针对最近的操作数有效,往往会使用小括号提高优先级!否则会提示错误!

image.png 本章内容到这里就结束了。我写博客的目的一是作为一个总结,另一个目的是能够帮助到别人巩固知识或者获得知识。如果你阅读完本章内容,发现你即使学习过java后依然能够有所收获或者你正在学习java然后获得了新知识,那么我写这篇文章的初衷就已经达到了。谢谢大家能够看到这里!

本人是一位软工小白,欢迎各位来指正错误,让我们一起加油,共同进步!