Java中的基本类型转换,数据溢出原理

java中的数据类型

  java是一种强类型语言,在java中,数据类型主要有两大类,基本数据类型和引用数据类型,不同的数据类型有不同的数据存储方式和分配的内存大小。

  基本数据类型中,各数据类型所表示的范围也是不一样的,如下所示:

  由于在java中,整数默认是采用int型,浮点数默认采用的是double型进行存储,所以在定义long型和float型数据时,必须在数值后面加‘l‘,‘L‘和‘f‘,‘F‘,如:

1 long a = 1000l;
2 long b = 2000L;
3 float c = 3.14f;
4 float d = 3.14F;

java 中的数据类型转换

在java中,存在两种转换的机制,默认类型转换(隐式转换)和强制类型转换。默认类型转换的规则如下:

  • byte,short,char  -> int ->long ->float ->double
  • 当byte,short,char相互之间不能转换,它们参与运算首先将转换成int类型进行运算。

强制类型转换:

  • 目标类型  变量名 = (目标类型)(被转换的类型)

在进行类型转换时:

  1. 容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出;使用时要格外注意。
  2. 有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算。
1 #案例代码
2 byte a = 3, b = 4, c;
3 c = a + b;
4 c = 3+4;
5 #语句 c = a + b ;因为a和b是变量,不确定具体的值,所以默认使用的int进行存储,则运算的结果为int型,
6  赋值为byte型报错,编译失败。
7
8 #语句 c = 3 + 4;因为3和4都是常量,所以java在编译时期会检查运算结果是否超出byte类型的范围,
9  没有超过则可以赋值。

byte的存储范围是-128-127的整数范围,那么如果有如下语句:

byte  a = (byte)130;

结果会是多少呢?java是如何处理强制类型转换的溢出处理呢?

在计算机中,所有的数据都是存储的补码形式,那么130首先被当成int型存储,四个字节32位,它的补码如下:0000 0000   0000 0000   0000 0000    1000 0010,转换为byte类型,进行截取,高字节部分去除,保留低字节部分,得到转换为byte类型的补码为:1000 0010,我们将其转换为源码:补码(1000 0010)->反码(1000 0001)->原码(1111 1110)为-126,所以最后的答案是-126.如果遇到其他的类型转换,也采用类似的处理方法。

快速计算强制类型转换的截取问题

在佛罗赞的《计算机导论》(原书第二版)中介绍了大量的数据类型在计算机中的存储方式,非常推荐这本书作为计算机专业的入门数据。书里面就讲解了计算机是如何进行数据截取的,如下图:

如此计算,是不是快速多了呢!

字符运算的类型转换

我们来看如下的代码

1 System.out.println(‘a‘);    #输出结果a
2 System.out.println(‘a‘+1);    #输出结果98
3 System.out.println("hello"+‘a‘+1);    #输出结果helloa1
4 System.out.println(‘a‘+1+"hell");    #输出结果98hello
5 System.out.println("5+5="+5+5);    输出结果5+5=55
6 System.out.println(5+5+"=5+5");    输出结果10=5+5

在与字符串运算时,采用从左到右的运算顺序,类型转换时,向高精度进行转换。任何数据和字符串进行操作,结果都是字符串类型。但是要注意运算的顺序。

欢迎关注我的公众号,互联网式街头艺人!

原文地址:https://www.cnblogs.com/baby-lily/p/10658051.html

时间: 2024-09-28 07:31:10

Java中的基本类型转换,数据溢出原理的相关文章

Java中的异常处理机制的简单原理和应用。

异常是指java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间.地点.人物.情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息. Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception,Erro

关于Java中的基本数据类型转换

Java中的基本类型有四种,其中整型分为byte.short.int.long,浮点型分为float.double,字符型char,布尔型boolean.8种类型的级别由低到高byte->short/char->int->long->float->double. Java中的基本数据类型转换分为隐式类型转换(自动类型转换)和显式类型转换(强制类型转换). 隐式类型转换是将一个较低级别的值或变量赋给一个较高级别的变量,在这种情况下,Java会自动地将较低级别的变量或值转换成与较

Java中double类型的数据精确到小数点后两位

Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585;BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue(); 二: new java.text.DecimalFormat("#.00").format(3.1415926) 三: double d = 3.1415926

Java中的Annotation(2)----Annotation工作原理

Java中的Annotation(2)----Annotation工作原理 分类: 编程语言2013-03-18 01:06 3280人阅读 评论(6) 收藏 举报 上一篇文章已经介绍了如何使用JDK的三个标准Annotation,本文将介绍Annotation的原理,以及如何自定义Annotation,并利用Annotation来完成一些实际的功能. 定义Annotation 定义新的Annotation类型使用@interface关键字,这从一定意义上说明Annotation和接口的定义是有

JavaSE基础(十)--Java中的基本数据类型转换

说基本数据类型转换之前,先了解下 Java 中的 8 种基本数据类型,以及它们的占内存的容量大小和表示的范围,如下图所示. 重新温故了下原始数据类型,现在来解释下它们之间的转换关系. 自动类型转换 自动类型转换是指:数字表示范围小的数据类型可以自动转换成范围大的数据类型. 如: long l = 100; int i = 200; long ll = i; 具体自动转换如如下图所示. 实线表示自动转换时不会造成数据丢失,虚线则可能会出现数据丢失问题. 自动转换也要小心数据溢出问题,看下面的例子.

Java中负数以及类型转换问题

学习过java的都知道,在java中,不是直观的表示负数,而是采用补码的形式表示负数. 这是为了硬件操作的方便,把减法也转换成加法来运算. 那补码是怎样表示的呢?为了得到补码,我们引入了反码. 对于正数来讲,它的反码补码都为本身,如果不明白为什么,我们可以这样理解:引入反码补码的原因就是为了解决减法的问题,换句话数就是解决java中负数的问题,正数不存在这些问题,所以它的反码补码就是它本身.在有符号的基本数据类型中,最高位0表示正数,最高位1表示负数. 对于负数来讲,它的反码就是除去符号位取反,

Java中随机数的产生方式与原理

查阅随机数相关资料,特做整理 首先说一下java中产生随机数的几种方式 在j2se中我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以把他乘以100,他就是个100以内的随机数字,这个在j2me中没有. 在java.util这个包里面提供了一个Random的类,我们可以新建一个Random的对象来产生随机数,他可以生产随机整数.随机float.随机double.随机long,这个也是我们在j2me的程序里经常用的一个取随机数的方法

JAVA中使用JSON进行数据传递

在接口的访问和数据的传输方面使用的比较多的是使用JSON对象来操作格式化数据:在服务器端采用JSON字符串来传递数据并在WEB前端或者Android客户端使用JSON来解析接收到的数据. 首先,在JAVA中使用JSON需要引入 org.json 包(点击 这里 可以下载相应的JAR包!), 并在程序中引入相应的JSON类: import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; 其

Java中String类型的数据比较

在Java中如果想比较两个字符串是否相等,可以使用string1==string2 或string1.equal(string2)来比较. 但是,第一种方法过于局限.例如, String string1="string": String string2="string": 此时,string1==string2的返回值为True. 但是,如果 String string1=new String("string"): String string2=