A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 长沙-小知姐姐 于 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中,自动类型转换是编译器在底层帮我们完成事情,我们无需干预,也不会出现问题;但是强制类型转换,是我们程序中强行把大数据类型的数值或者变量,赋值给小数据类型,造成的数据溢出,或者精度损失,我们理解了原理,才能更好的帮助我们避免程序中的类似问题。在实际开发中,我们对于基本数据类型的运算,要尽量避免强类型转换的情况发生,丢失数据是我们程序员的大问题。

1 个回复

倒序浏览
一个人一座城0.0 来自手机 中级黑马 2018-12-30 13:22:33
沙发
看一看。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马