详解解密Java中的类型转换问题
众所周知Java中的数据类型是强数据类型,基本数据类型之间的转换尤其固定的规则,当数据宽度比较窄的数据类型(如int)转换成数据类型比较宽的数据类型时(如double),则窄的数据类型会加宽,可以完成自动类型转换,这称为隐式转换。
如:以下代码没有任何问题,结果也是正确的,成绩不会发生变化,所不同的是成绩的精度提高了。
intintScore = 96; doubledoubleScore = intScore;
那么如果试图把宽的数据类型(如double)转换成窄的数据类型(如float)时,编译器会提示编译错误,想要编译通过,需要进行强制类型转换。那么,此时的数据会发生截断。产生的结果是:
1. 数据正确,只是精度降低了;
2. 数据不正确,发生了溢出;
对于上述第1种情况,比较好理解,我们来看个例子:
float floatWeight= 63.5; //编译错误 double doubleWeight= 63.5;
上述第一条语句会提示编译错误,那是因为编译器看到63.5时,会把它当做一个double类型,把一个double类型赋给float类型,当然编译不通过了。推荐的解决方案是:
float floatWeight = 63.5f;
当然,你也可以强制转换成float类型:
float floatWeight = (float)63.5;
其实,上述语句本质是把double类型的数据强制转换成float类型,发生了截断。虽然数据的大小没有变化,但是数据的精度却降低了。
同理:
doubleWeight = floatWeight; //隐式转换 floatWeight = (float)doubleWeight;//强制转换
现在,问题来了,既然是截断,怎么会产生溢出呢?我们先来看个例子:
shorti = 150; shortj = 75; byteb = (byte) i; byted = (byte) j; System.out.println("b = " + b); System.out.println("d = " + d);
以上代码的输出结果是:
b = -106
d = 75
看到结果,不免会问为什么b=-106呢?这是因为强制转换时发生溢出。由于150超出了byte能够表示的最大范围(-128 ~ 127)。
那么-106又是如何得来的呢?
i = 150,用二进制表示i = 0000 0000 1001 0110,short类型占2个字节,16位,最高位的0表示正数。当把i强制转换成byte类型时,高位发生截断,i = 1001 0110。在计算机中,用补码表示,最高位的1表示负数,那么用原码表示的话:i = 1110 1010,正好表示十进制数-106。
至此,也就解释了为什么截断也可能会发生溢出。
以上所述是小编给大家介绍的Java中的类型转换问题详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
相关推荐
-
java string类型转换boolean类型的方法
今天偶然想把string 类型转换成 boolean 类型 ,查了下api文档,发现文档似乎有点不太对经... 嗯,就直接发测试代码吧,废话懒得说了... String s1 = "false"; String s2 = "true"; String s3 = "fAlSe"; String s4 = "TrUe"; String s5 = "true_a"; 以上的string 分别用 Boolean.g
-
java对象类型转换和多态性(实例讲解)
对象类型转换 分为向上转型和向下转型(强制对象转型). 向上转型是子对象向父对象转型的过程,例如猫类转换为动物类:向下转型是强制转型实现的,是父对象强制转换为子对象. 这和基础数据类型的转换是类似的,byte在需要时会自动转换为int(向上转型),int可以强制转型为byte(向下转型). 对于对象转型来说, 向上转型后子对象独有的成员将不可访问 . 意思是,在需要一只动物时,可以把猫当作一只动物传递,因为猫继承自动物,猫具有动物的所有属性.但向上转型后,猫不再是猫,而是被当作动物看待,它自己独
-
Java中对null进行强制类型转换的方法
今天很好奇,对null进行强转会不会抛错.做了如下测试得到的结果是,如果把null强转给对象,是不会抛异常的,本身对象是可以为null的.但是如果是基本类型,比如 int i = (Integer)obj的强转,其实内部会调用intvalue方法去赋值给基本类型,所以这时候是会报错的. 代码如下 Object obj = null; Integer s1 = (Integer)obj; 上面能正常执行,即把null赋值给一个对象或者强行类型转换赋值给对象都是没有问题的.如果s1是 int的基本类
-
java DateUtil工具类时间戳类型转换详解
本文实例为大家分享了DateUtil工具类时间戳类型转换的具体代码,供大家参考,具体内容如下 package com.sinosoft.media.sms.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DateUtil { //当前时间 //public static Date DATE_NOW=new Date(); /*
-
java的各种类型转换全部汇总(推荐)
java类型转换 Integer String Long Float Double Date 1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]); 2). int i = Integer.valueOf(my_str).intValue(); 注: 字串转成 Double, Float, Long 的方法大同小
-
Java数据类型转换详解
一.基本数据类型阐述 Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. [注]JAVA没有unsigned类型 (1). 整数:int,short,byte,long (2). 浮点型:float,double (3). 字符:char (4). 布尔:boolean 基本型别 大小 最小值 最大值 void boolean ----- -----
-
java中long数据类型转换为int类型
由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况: 主要以下几种转换方法,供参考: 一.强制类型转换 long ll = 300000; int ii = (int)ll; 二.调用intValue()方法 long ll = 300000; int ii= new Long(ll).intValue(); 三.先把long转换成字符串String,然后在转行成Integer long ll = 300000; i
-
详解解密Java中的类型转换问题
众所周知Java中的数据类型是强数据类型,基本数据类型之间的转换尤其固定的规则,当数据宽度比较窄的数据类型(如int)转换成数据类型比较宽的数据类型时(如double),则窄的数据类型会加宽,可以完成自动类型转换,这称为隐式转换. 如:以下代码没有任何问题,结果也是正确的,成绩不会发生变化,所不同的是成绩的精度提高了. intintScore = 96; doubledoubleScore = intScore; 那么如果试图把宽的数据类型(如double)转换成窄的数据类型(如float)时,
-
详解在java中进行日期时间比较的4种方法
1. Date.compareTo() java.util.Date提供了在Java中比较两个日期的经典方法compareTo(). 如果两个日期相等,则返回值为0. 如果Date在date参数之后,则返回值大于0. 如果Date在date参数之前,则返回值小于0. @Test void testDateCompare() throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-
详解在Java中如何创建多线程程序
创建多线程程序的第一种方式:创建Thread类的子类 java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类 实现步骤: 1.创建一个Thread类的子类 2.在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程要做什么?) 3.创建Thread类的子类对象 4.调用Thread类中的方法start方法,开启新的线程,执行run方法 void start()使该线程开始执行;Java虚拟机调用该线程的run方法. 结果是两
-
详解处理Java中的大对象的方法
目录 String中的substring 集合大对象扩容 保持合适的对象粒度 Bitmap 把对象变小 数据的冷热分离 数据双写 写入 MQ 分发 使用 Binlog 同步 思维发散 小结 本文我们将讲解一下对于“大对象”的优化.这里的“大对象”,是一个泛化概念,它可能存放在 JVM 中,也可能正在网络上传输,也可能存在于数据库中. 那么为什么大对象会影响我们的应用性能呢? 第一,大对象占用的资源多,垃圾回收器要花一部分精力去对它进行回收: 第二,大对象在不同的设备之间交换,会耗费网络流量,以及
-
详解Go语言中的数据类型及类型转换
目录 1.基本数据类型 2.基础数据类型转换 3.基本数据类型转为字符串 4.strconv的使用 5.字符串转为基础类型 1.基本数据类型 数据类型有很多,先研究一下基础的,例如:布尔型.数字类型.字符串类型. 数字类型有uint8.uint16.uint32.uint64.int8.int16.int32.int64(uint和int区别在于uint为无符号整数,即只支持正数,不支持负数形式) 数字浮点型有fload32.float64.complex64.complex126(后面两个均为
-
详解Spring Security中获取当前登录用户的详细信息的几种方法
目录 在Bean中获取用户信息 在Controller中获取用户信息 通过 Interface 获取用户信息 在JSP页面中获取用户信息 在Bean中获取用户信息 Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (!(authentication instanceof AnonymousAuthenticationToken)) { String currentU
-
详解node.js中的npm和webpack配置方法
概述 Node.js用c++语言编写而成的,是一个基于chrome V8引擎的javascript运行环境,让javaScript的运行脱离浏览器服务端,可以使用javaScript语言书写服务器端代码 1.使用node来实现一个http服务器 下面创建了一个端口为8787的服务器.他与php,java等不同,像php本地还要基于阿帕奇服务器,node.js能用代码快速搭建一个服务器. // 引入http模块 var http = require("http"); // 调用http的
-
详解C# 泛型中的数据类型判定与转换
提到类型转换,首先要明确C#中的数据类型,主要分为值类型和引用类型: 1.常用的值类型有:(struct) 整型家族:int,byte,char,short,long等等一系列 浮点家族:float,double,decimal 孤独的枚举:enum 孤独的布尔:bool 2.常用的引用类型有: string,class,array,delegate,interface 值得注意的是,无论是值类型还是引用类型,在C#中都派生于object,没错,这家伙就是万恶之源! 正是因为有了这一特性,于是我
-
详解在spring中使用JdbcTemplate操作数据库的几种方式
使用JdbcTemplate的步骤 1.设置spring-jdbc和spring-tx的坐标(也就是导入依赖) <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.7.RELEASE</version> </dependency> <dependency&
-
详解c# 强制转换和类型转换
由于 C# 是在编译时静态类型化的,因此变量在声明后就无法再次声明,或无法分配另一种类型的值,除非该类型可以隐式转换为变量的类型. 例如,string 无法隐式转换为 int. 因此,在将 i 声明为 int 后,无法将字符串"Hello"分配给它,如以下代码所示: int i; // error CS0029: Cannot implicitly convert type 'string' to 'int' i = "Hello"; 但有时可能需要将值复制到其他类
随机推荐
- 详解Spring的核心机制依赖注入
- redis集群规范详解
- C#利用SFTP实现上传下载
- li的简单应用
- 解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
- javascript实现下雨效果
- VBS 生成不重复随机数代码[0-10]
- CentOS 7.0下SVN服务器图文搭建教程
- Java绘图技术的详解及实例
- python3设计模式之简单工厂模式
- .NET Core 2.0迁移小技巧之web.config 配置文件示例详解
- VS2013连接MySQL5.6成功案例一枚
- javascript 文档的编码问题解决
- java Struts2 在拦截器里的跳转问题
- AJAX集天气\IP\多国语言翻译MP3(可同步LRC歌词显示)\万年历查询通
- JS的replace方法介绍
- JavaScript制作简易计算器(不用eval)
- IE7 beta2的CSS兼容性
- CentOS+Nginx+PHP+MySQL标准生产环境配置方法
- jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)