zoukankan      html  css  js  c++  java
  • 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

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

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

  • 相关阅读:
    EasyBPM进销存之物料管理
    水厂流程三维场景可视化解决方案
    构造器
    可变形参
    重写
    拥塞处理(一)——拥塞处理的历史概述
    idea的各种乱码问题
    MySQL的主键也想使用uuid
    使用spring security明文密码校验时报错-BadCredentialsException: Bad credentials
    ValueError: check_hostname requires server_hostname
  • 原文地址:https://www.cnblogs.com/baby-lily/p/10658051.html
Copyright © 2011-2022 走看看