Java基础之数据类型转换

知识点汇总

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

  • 自动类型转换:将取值范围小的类型自动提升为取值范围大的类型。
int a = 1;
byte b = 2;
byte c = a + b;// 报错,类型不匹配

在最后一个运算中,a+b的结果为int类型,取值范围大于用于接收的byte类型,所以报错。

  • 强制转换:将取值范围大的类型强制转换为取值范围小的类型。
int a = (int)1.5;
short s = 1;
s = s + 1;// 编译失败,s+1的结果就是自动提升为int类型,而s接收的却是short类型。
s = (short)s + 1;
  • ASCII码表就记住几个关键的对应关系。
字符		数值
0		48
A		65
a		97

tip:小a的数值更大。

  • a++和++a
    这个其实非常简单,a++是先赋值再运算(加1),而++a是先运算(加1)再赋值
int a = 1;
int b = a++;
// 打印a = 2;
// 打印b = 1;

int a = 1;
int b = ++a;
// 打印a=2;
// 打印b=2;
  • +=符号的扩展
    这个也是一道常见的面试题
short s = 1;
s = s + 1;// 报错
s += 1;// 输出结果为2

原因
第一种报错的情况前面已经分析过了,这里说第二种为什么可以正常运行。表面是s += 1–>s = s + 1;但是,s = s + 1进行了两次运算,而+=是一个运算符,只运算一次,并带有强制转换的特点,也就是说s += 1-->s = (short) (s + 1),因此程序正常运行。

  • 还有一个关于常量和变量赋给byte、short数据类型的不同。看下面这段代码
byte b1=1;
byte b2=2;
byte b3=1 + 2;
byte b4=b1 + b2;
System.out.println(b3);//正常输出3
System.out.println(b4);// 编译报错

原因
b3 = 1 + 2 , 1 和 2 是常量,为固定不变的数据,在编译的时候(编译器javac),已经确定了 1+2 的结果并没有超过byte类型的取值范围,可以赋值给变量 b3 ,因此 b3=1 + 2 是正确的。
反之, b4 = b2 + b3 , b2 和 b3 是变量,变量的值是可能变化的,在编译的时候,编译器javac不确定b2+b3的结果是什么,因此会将结果以int类型进行处理,所以int类型不能赋值给byte类型,因此编译失败。

总结:小的取值范围的数据类型可以被大的包含,也就是可以自动向上转,但是大的数据类型要往下强转,就有可能出现精度损失或者数据丢失的情况。大的数据类型在向下转型时是一个砍字节的过程。比如:

short s = 1;
s = (short) (s+1); 
  1. short占两个字节,1默认为int类型占4个字节
  2. 两者相加,short自动转换为int,多补了两个字节
  3. 相加完成,目前是4个字节的一个状态
  4. 然后加上(short)进行一个强转,因为short在内存中占用两个字节,所以就将原本的4个字节的结果去除为只剩下两个字节。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值