• Java的数据类型


    数据类型分类:
    A:基本数据类型
    B:引用数据类型(类,接口,数值)
    基本数据类型:4类8种
    A:整数 占用字节数
    byte 1
    short 2
    int 4
    long 8
    B:浮点数
    float 4
    double 8
    C:字符
    char 2
    D:布尔类型
    boolean 1
    注意:
    整数默认是int类型
    浮点数默认是double类型。
    长整型后缀用L或者l标记。建议使用L。
    单精度浮点数用F或者f标记。建议使用F。
    byte,short在定义的时候,他们接收的其实是一个int类型的值。
    这个是自己做了一个数据检测的,如果不再他们的范围内,就报错。
    例子:
    class DataTypeDemo {
    public static void main(String[] args) {
    //定义变量的格式:
    //数据类型 变量名 = 初始化值;

    //定义一个字节变量
    byte b = 10;
    System.out.println(10);
    System.out.println(b);

    //定义一个短整型变量
    short s = 100;
    System.out.println(s);

    //定义一个整型变量
    int i = 1000;
    System.out.println(i);
    如果 是 int i = 100000000 这是超过了int的范围;

    //定义long时 (在最后加L)
    long j = 100000000L;
    System.out.println(j);

    //定义浮点数据变量
    float f = 12.345F;
    System.out.println(f);
    double d = 12.345;
    System.out.println(d);

    //定义字符型变量
    char ch = 'a';
    System.out.println(ch);

    //定义布尔类型变量
    boolean flag = true;
    System.out.println(flag);
    }
    }

    一般来说,我们在运算的时候,要求参与运算的数据类型必须一致。
    boolean类型不能转换为其他的数据类型。
    默认转换(从小到大的转换):
    A:byte,short,char-int-long-float-double
    B:byte,short,char,相互之间不转换,他们参与运算首先转换为int类型。
    有一个问题:为什么long 8个字节会在float前面?
    答:A:他们底层的储存结构不同。
    B:float表示的数据范围比long的范围要大。
    下面是一个加法运算在计算机内部进行的情况例子:
    byte a = 3;
    int b =4;
    byte c = a+b;//有问题 错的
    int d = a+b;//没有问题 对的
    首先计算出数据对应的二进制(因为在计算机内部都是01);
    十进制的3对应二进制的11;
    十进制的4对应二进制的100;

    a+b=c在计算机内部是这个样子:
    byte c = 3; 00000011(计算机储存的样子)
    int b = 4;00000000 00000000 00000000 00000100(计算机内部储存的样子)
    但是 由于默认转换 小类型(byte,short,char,)自动转换为大类型变为int类型
    所以 00000011会变成00000000 00000000 00000000 00000011
    最后做加法 结果是00000000 00000000 00000000 00000111

    强制类型转换:
    从大的数据类型到小的数据类型。
    格式:
    目标数据类型 变量 = (目标数据类型) (被转换的数据)
    注意:
    不要随意的使用强制类型转换,因为它隐含了精度损失问题。
    思考题1:请问下面这个有没有问题
    double d = 12.345;
    float f = d;
    思考题2:看看下面两个定义有没有区别?
    float f1 = (float) 12.345;
    float f2 = 12.345f;
    f1其实是通过一个double类型转换过来的。
    而f2本身就是一个float类型。
    面试题:
    byte b1=3,b2=4,b;
    b=b1+b2;
    b=3+4;
    哪句是编译失败的呢?为什么呢?
    答:b = b1+b2;是有问题的。
    因为变量相加,会首先看类型问题,最终把结果赋值的也会考虑类型问题。
    意思就是b1这个byte类型和b2这个byte类型相加的时候会变成int类型所以将后面变为byte类型 即b=(byte)(b1+b2);
    常量相加,首先做加法,然后看结果是否在赋值的数据类型范围内,不过不是,才会报错。
    面试题2:
    byte b = 130;有没有问题?如果想让赋值正确,可以怎么做?结果是多少?
    答:因为byte的范围是:-128到127。因为130不在这个范围之内,所以报错。
    我们可以进行强制转换:byte b = (byte) 130;
    System.out.println(b);
    答案是多少呢?
    我们想要知道结果是什么,就应该知道是如何进行计算的。
    而我们又知道计算机中数据的运算都是补码进行的。
    而要得到补码,首先要计算出数据的二进制。
    A:获取130这个数据的二进制
    00000000 00000000 00000000 10000010
    这是130的原码,也是反码,还是补码(因为130是正数)。
    B:做截取操作,截成byte类型的了。
    10000010
    这个结果是补码。
    C:已知补码求原码():
    符号位 数值位
    补码 1 0000010
    反码 1 0000001
    原码 1 1111110
    1111111表示byte范围(-128到127)中的127所以数值位1111110表示的数是126,又因为符 号位是1所以是-126,则答案输出结果是-126。

  • 相关阅读:
    全局变量 static变量
    【Qt学习笔记】04_单选复选框
    【Qt学习笔记】03_特殊标签
    【Qt学习笔记】02_颜色对话框
    【Qt学习笔记】01_模态和非模态
    ThinkPad_E570 拆机
    VMware 共享文件夹
    【安装Flutter遇到的问题】 Android license status unknown
    VLC 外挂字幕乱码
    IE(IE6/IE7/IE8)支持HTML5标签--20150216
  • 原文地址:https://www.cnblogs.com/lszbk/p/12318571.html
Copyright © 2020-2023  润新知