zoukankan      html  css  js  c++  java
  • 04-数据类型转换

    Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。

    隐士转换(自动类型转换)

    自动转换:将 取值范围小的类型 自动提升为 取值范围大的类型 。

    public static void main(String[] args) {
        int i = 1;
        byte b = 2;
        // byte x = b + i; // 报错
        //int类型和byte类型运算,结果是int类型
        int j = b + i;
        System.out.println(j);
    }
     

    运算结果,变量的类型将是 int 类型,这就是出现了数据类型的自动类型转换现象。

    byte 类型内存占有1个字节,在和 int 类型运算时会提升为 int 类型 ,自动补充3个字节,因此计算后的结果还是 int 类型。

    同理,当一个 int 类型变量和一个 double 变量运算时, int 类型将会自动提升为 double 类型进行运算。

    public static void main(String[] args) {
        int i = 1;
        double d = 2.5;
        //int类型和double类型运算,结果是double类型
        //int类型会提升为double类型
        double e = d+i;
        System.out.println(e);
    }

    转换规则:

    范围小的类型向范围大的类型提升, byte、short、char 运算时直接提升为 int 。

    byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double

    强制类型转换

    将 1.5 赋值到 int 类型变量会发生什么?产生编译失败,肯定无法赋值

    int i = 1.5; // 错误

    double 类型内存8个字节, int 类型内存4个字节。 1.5 是 double 类型,取值范围大于 int 。

    想要赋值成功,只有通过强制类型转换,将 double 类型强制转换成 int 类型才能赋值。

    强制类型转换:将 取值范围大的类型 强制转换成 取值范围小的类型 。

    自动转换是Java自动执行的,而强制转换需要我们自己手动执行。

    转换格式:

      数据类型 变量名 = (数据类型)被转数据值;

    // double类型数据强制转成int类型,直接去掉小数点。
    int i = (int)1.5;

    同理,当一个 short 类型与 1 相加,我们知道会类型提升,但是还想给结果赋值给short类型变量,就需要强制转换。

    public static void main(String[] args) {
         //short类型变量,内存中2个字节
         short s = 1;
         /*
           出现编译失败
           s和1做运算的时候,1是int类型,s会被提升为int类型
           s+1后的结果是int类型,将结果在赋值会short类型时发生错误
           short内存2个字节,int类型4个字节
           必须将int强制转成short才能完成赋值
         */
         s = s + 1;//编译失败
         s = (short)(s+1);//编译成功
    }

    注意:

      浮点转成整数,直接取消小数点,可能造成数据损失精度。
      int 强制转成 short 砍掉2个字节,可能造成数据丢失。

    // 定义s为short范围内最大值
    short s = 32767;
    // 运算后,强制转换,砍掉2个字节后会出现不确定的结果
    s = (short)(s + 10);

    byte b;
    b = 3;
    b = b*3;java会自动做类型提升,将b自动提升为int,因此,会发生错误。
    b = (byte)b*3;这样,但是还是报错,因为强制类型转换比乘法优先级高。
    b = (byte)(b*3);应该这样。

    ASCII码表

    对于字符来说,存储的时候,会转为对应的ascII码来进行存储的。
    因此,字符在计算机中的表示都是以整数来进行表示的。

    public static void main(String[] args) {
      //字符类型变量
      char c = 'a';
      int i = 1;
      //字符类型和int类型计算
      System.out.println(c+i);//输出结果是98
    }

    ASCII( American Standard Code for Information Interchange 美国标准信息交换码)。

    在char类型和int类型计算的过程中,char类型的字符先查询编码表,得到97,再和1求和,结果为98。

    实际就是char类型提升为了int类型(自动类型转换)。char类型内存2个字节,int类型内存4个字节。

    ASCII码表

     

    java中1.3这种认为是double类型的,因此,1.3f这样表示1.3是float类型的。
    c中非0即为真,因此可以while(1)这样,但是java中不行,java只能while(true)这样。


  • 相关阅读:
    Python进阶: Decorator 装饰器你太美
    计算机网络自顶向下方法第3章-传输层 (Transport Layer).2
    Python进阶:值传递,引用传递?不存在的,是赋值传递
    Python进阶:对象复制与比较,分深浅,见真假
    Python基础:模块化来搭项目
    这说明一个问题
    我稍微思考了一下
    由LruCache和DiskLruCache提供三级缓存支持的ImageLoader
    回忆一个加塞方法
    三年六班的李子明同学,你妈拿了两本计算机基础在二号树上等你
  • 原文地址:https://www.cnblogs.com/Leo101018/p/13809269.html
Copyright © 2011-2022 走看看