本帖最后由 长沙-小知姐姐 于 2019-1-3 09:31 编辑
1. Java中的类型转化:
Java中的类型转换分为两种,自动类型转换和强制类型转换两种。那么为什么自动类型之间的相互转换没有问题,而强制类型转换后,有的没有问题,而有的就出现了问题呢?下面给大家看看这里面到底发生了什么我们看不到的事情。
2. 了解010101:
首先各位一定知道的是,无论是什么类型的数据,当存储到计算机底层时都会转换成一堆01010这样的位(bit)也叫二进制,而0和1所能表示的数字有限,要么是0要么是1,那么如果要表示很多其他数据,就不好处理,所以人们就用8个bit位作为一组,可以用来表示更多的数字,这也就是我们计算机中的最小单位字节(byte),这个词相信大家都不陌生吧。
一个字节,也就是8个bit位(0000 0000),在计算机中刚好有能代表这个范围的数据类型->byte,byte类型的取值返回是-128~127。在我们计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
3. 二进制转十进制:
那么8个0000 0000二进制,又是如果表示255个数字的呢?教同学们一个比较简单的方式来作十进制和二进制之间的相互转换,下面图:
4. 回顾自动类型转换:
我们可以先来回顾一下自动类型转换:
自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下:
低---------------------------------------------> 高
byte,short,char-> int -> long -> oat -> double 5. 问题所在 - 强制类型转换:
下面来看看强制类型转换:
强制类型转换的本质是:大空间存储的数据转换为小空间存储的数据,或小空间存储的数据转换为大空间转换的数据。
byte 类型的数据,只有一字节的内存空间,只能保存-128~127 之间的数据,如果一个short s = 100;在进行强制转换时,因为100是在byte的取值范围的,所以强制转换为byte后,得到的值为 100
如果一个short l = 300;在强制转换时,因超出了byte存储空间的最大值,它就会像一个圆盘一个,超了最大的值,就会取此类型的最小值,127,如果值300,转换后,得到的值为44
6,总结 在Java中,自动类型转换是编译器在底层帮我们完成事情,我们无需干预,也不会出现问题;但是强制类型转换,是我们程序中强行把大数据类型的数值或者变量,赋值给小数据类型,造成的数据溢出,或者精度损失,我们理解了原理,才能更好的帮助我们避免程序中的类似问题。在实际开发中,我们对于基本数据类型的运算,要尽量避免强类型转换的情况发生,丢失数据是我们程序员的大问题。
|