java中基本数据类型


一、写在前面

  1. 计算机存储单位:计算机只能识别二进制(10011001…),1bit就是一个0或者1,1byte = 1字节=8bit。

  2. 基本数据类型介绍

    本数据类型占用空间二进制位数取值范围默认值
    byte1字节8bit [ − 2 7 , 2 7 − 1 ] [-2^7, 2^7-1] [27,271] [ − 128 , 127 ] [-128, 127] [128,127]0
    short2字节16bit [ − 2 15 , 2 15 − 1 ] [-2^{15}, 2^{15}-1] [215,2151] [ − 32768 , 32767 ] [-32768,32767] [32768,32767]0
    int4字节32bit [ − 2 31 , 2 31 − 1 ] [-2^{31}, 2^{31}-1] [231,2311] [ − 2147483648 , 2147483647 ] [-2147483648,2147483647] [2147483648,2147483647]0
    long8字节64bit [ − 2 63 , 2 63 − 1 ] [-2^{63}, 2^{63}-1] [263,2631]0L
    float4字节32bit [ − 2 31 , 2 31 − 1 ] [-2^{31}, 2^{31}-1] [231,2311]0.0f
    double8字节64bit [ − 2 63 , 2 63 − 1 ] [-2^{63}, 2^{63}-1] [263,2631]0.0
    boolean1字节8bittrue、falsefalse
    char2字节16bit [ 0 , 2 16 − 1 ] [0, 2^{16}-1] [0,2161] [ 0 , 65535 ] [0,65535] [0,65535]‘\u0000’

    注意
    (1) 在任何情况下整数型数据默认被当作int类型处理,如果希望被当作long类型处理则需要在数据后面加上字母L

    // 自动类型转换,int转long
    long a = 2147483647;
    // 报错,因为2147483648这个数据默认被当作int,但其超出了int取值范围
    long b = 2147483648;
    // 加上L后2147483648就被当作long
    long c = 2147483648L;
    

    (2) 基本数据类型容量大小排序:byte < short(char) < int < long < float < double(规定浮点型比整型大)



二、自动类型转换、强制类型转换和其他情况

  1. 自动类型转换:小容量类型可直接赋值给大容量类型,称为自动类型转换

    int a = 1;// 不存在类型转换
    long b = a;// int类型数据自动转为long类型数据
    long c = 1;// int类型数据1自动转为long类型数据
    long d = 1L;// 不存在类型转换
    
  2. 强制类型转换:大容量类型不可以直接赋值给小容量类型,需要强制类型转换

    long a = 1;
    int b = (int)a;
    int c = a;// 编译不通过
    
  3. 其他情况

    byte b = 127;
    short s = 10000;
    char c = 65535;
    

    注意:
    (1) 强转的原理就是强制砍掉二进制位数,如:long转int就会强制砍掉左边4个二进制位数。所以强制类型转换在大容量类型数据超过小容量类型取值范围时,会导致精度损失。

    (2) 对于byte、short和char,只要数据值不超过它们的取值范围,则可以直接赋值,不用把默认的int强转为byte/short/char。



三、关于char

在《java核心技术》中描述char类型是UTF-16编码中的一个代码单元,因此可以知道char的字符编码是UTF-16。
测试:

char c1 = '中';
char c2 = 'a';
char c3 = 'A';
char c4 = '0';
System.out.println("字符:" + c1 + "  " + "编码:" + (int) c1);
System.out.println("字符:" + c2 + "  " + "编码:" + (int) c2);
System.out.println("字符:" + c3 + "  " + "编码:" + (int) c3);
System.out.println("字符:" + c4 + "  " + "编码:" + (int) c4);
字符:中  编码:20013
字符:a  编码:97
字符:A  编码:65
字符:0  编码:48

结论:

  • char的取值范围是[0,65535]其中的每一个数字表示UTF-16的编码即对应1个字符
  • char类型可以进行运算,但本质上是字符对应的编码进行运算,最终输出的运算结果为编码运算后对应的字符


四、多种基本数据类型的混合运算

  1. byte、short、char混合运算:各自会先转为int后再进行运算,运算结果为int类型

    byte a = 1;
    short b = 2;
    char c = '0';// 转为int后为48
    System.out.println(a + b + c);// 输出51
    
  2. 包含long、int或浮点型的混合运算:谁大听谁的,各自转换为容量最大的那个数据类型再进行运算

    long a = 1;// 1.0
    double b = 0.2;
    char c = '9';// 57.0
    System.out.println(a + b + c);// 58.2
    
  3. 练习:判断下列代码哪些编译不通过、输出结果是什么

    1. 编译报错,因为1000超过了byte的取值范围,此时需要把int强转为byte 
    2. 编译通过,20在byte取值范围内 (byte、short、char在其取值范围内可直接赋值,不用强转int)
    3. 编译通过,1000在short取值范围内,理由如上
    4. 编译通过
    5. 编译通过,自动类型转换,小容量类型自动转换为大容量类型
    6. 编译报错,大容量类型转为小容量类型需要强制类型转换
    7. f=3
    8. 小容量类型自动转换为大容量类型
    9. 编译报错,g为long类型与3(int)运算结果为long,大容量类型转为小容量类型需要强制类型转换
    10. 编译通过
    11. 编译报错,首先把g强转为byte然后g会自动转换为int与3(int)运算最终结果为int类型
    12. 编译通过
    13. 编译通过
    14. 编译通过
    15. 编译报错,byte与short的运算会先转为int
    16. 编译通过
    17. 编译通过
    18. 编译通过,字符串可以与字符相连
    19. 输出字符'a'的ASCII码
    20. 编译通过,char与int运算时,char会先转为int
    21. 输出'a'的ASCII码与100相加后的结果 
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值