java类型转换易犯的错误
2015-08-31 15:16
441 查看
问题引入:
byte a=1;
byte b=3;
byte c=a+b;
byte d=1+3;
为什么byte c=a+b;这个不对。byte d=1+3;这个却没有错误
解答:
+操作会将变量转成int
1+3编译器会自动转成4
做加法运算的时候,数据类型是首先转变成int
这样就对了:byte c=(byte)(a+b);
为什么 short s=1; s=s+1; 在编译是会有问题提示说不可以将int类型转换成short类型。但是short s=1; s+=1;就没有上述的问题呢?难道s+=1 跟s=s+1;不等价吗?
不等价,s+=1;s++等运算符是自身相加,类型不变,而s=s+1;其实是分两步的,第一步先算s+1;这里1是整型,向大兼容,得出结果是整型,然后再把这个整型赋值给s,这当然是不行的,所以必须得转换.但是反过来,如果s是浮点型的话,会怎样呢,是的,不需要强转,因为向大兼容。
Java中涉及byte、short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果。因此,如果把两个byte类型值相加,最后会得到一个int类型的结果。如果需要得到byte类型结果,必须将这个int类型的结果显式转换为byte类型。计算机中数值进行运算的时候可能会发生溢出错误。例如,byte型的变量,共占8个2进制位,其值的范围是:-128~127,如果给byte赋值的数在-128-127之间,那么可以直接赋值,否则必须进行强制转换,否则出错。若两个值为127的byte型变量相乘,结果会怎么样呢?所以,像byte这种值域很小的变量类型,要限制保存结果用的变量的类型。
byte a=1;
byte b=3;
byte c=(byte)a+b;
1+3的结果在-128~127之间,所以没有溢出,也就没有发生错误,如果改成byte d=127+127;就会发生错误了,空间不能容下这么大的数。其实这个与相关的编译器有关的。
byte,short,char之间不会互相转换,三者在计算时先会转换为int类型,char类型数据和byte,short,int或long运算的结果总是int类型数据
byte b1 = 67;
byte b2 = 89;
byte b3 = (byte)(b1 + b2);
用补码表示:
(67)10 = (0000000000000000000000001000011)2
(89)10 = (0000000000000000000000001011001)2
两者相加,得:(0000000000000000000000010011100)2
由于已经超出了byte的范围,截去前面24位,得:(10011100)2
将其转化为原码:【10011100】补
= -(【0011100】反 + 1)
= -(1100011 + 1)
= -1100100
转化为十进制即为-100
我们可以借助字面量这个词来帮助我们理解赋值的过程:
字面量是对信息、数据的一个表述。或者说是我们直接用来表述的数值或字符。
比如:byte a=64; //其中64就是字面量。
1,2,64等等是整数字面量,它们默认是int型。而1.2,3.4等等是浮点字面量,默认是double型。
不是默认类型字面量,要在其后加上类型标识。
比如:46+7.8f
对于整数字面量,Java编译系统会自动匹配字面量的类型。
当一个int型字面量的值被赋给一个byte 或short型的变量时,如果字面量的值没有超过对应类型的范围时,就不会产生错误。然而,其他类型的字面量(如:short,long,char,double等等)是没有这个功能的。
byte a=1;
byte b=3;
byte c=a+b;
byte d=1+3;
为什么byte c=a+b;这个不对。byte d=1+3;这个却没有错误
解答:
+操作会将变量转成int
1+3编译器会自动转成4
做加法运算的时候,数据类型是首先转变成int
这样就对了:byte c=(byte)(a+b);
为什么 short s=1; s=s+1; 在编译是会有问题提示说不可以将int类型转换成short类型。但是short s=1; s+=1;就没有上述的问题呢?难道s+=1 跟s=s+1;不等价吗?
不等价,s+=1;s++等运算符是自身相加,类型不变,而s=s+1;其实是分两步的,第一步先算s+1;这里1是整型,向大兼容,得出结果是整型,然后再把这个整型赋值给s,这当然是不行的,所以必须得转换.但是反过来,如果s是浮点型的话,会怎样呢,是的,不需要强转,因为向大兼容。
Java中涉及byte、short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果。因此,如果把两个byte类型值相加,最后会得到一个int类型的结果。如果需要得到byte类型结果,必须将这个int类型的结果显式转换为byte类型。计算机中数值进行运算的时候可能会发生溢出错误。例如,byte型的变量,共占8个2进制位,其值的范围是:-128~127,如果给byte赋值的数在-128-127之间,那么可以直接赋值,否则必须进行强制转换,否则出错。若两个值为127的byte型变量相乘,结果会怎么样呢?所以,像byte这种值域很小的变量类型,要限制保存结果用的变量的类型。
byte a=1;
byte b=3;
byte c=(byte)a+b;
1+3的结果在-128~127之间,所以没有溢出,也就没有发生错误,如果改成byte d=127+127;就会发生错误了,空间不能容下这么大的数。其实这个与相关的编译器有关的。
byte,short,char之间不会互相转换,三者在计算时先会转换为int类型,char类型数据和byte,short,int或long运算的结果总是int类型数据
byte b1 = 67;
byte b2 = 89;
byte b3 = (byte)(b1 + b2);
用补码表示:
(67)10 = (0000000000000000000000001000011)2
(89)10 = (0000000000000000000000001011001)2
两者相加,得:(0000000000000000000000010011100)2
由于已经超出了byte的范围,截去前面24位,得:(10011100)2
将其转化为原码:【10011100】补
= -(【0011100】反 + 1)
= -(1100011 + 1)
= -1100100
转化为十进制即为-100
我们可以借助字面量这个词来帮助我们理解赋值的过程:
字面量是对信息、数据的一个表述。或者说是我们直接用来表述的数值或字符。
比如:byte a=64; //其中64就是字面量。
1,2,64等等是整数字面量,它们默认是int型。而1.2,3.4等等是浮点字面量,默认是double型。
不是默认类型字面量,要在其后加上类型标识。
比如:46+7.8f
对于整数字面量,Java编译系统会自动匹配字面量的类型。
当一个int型字面量的值被赋给一个byte 或short型的变量时,如果字面量的值没有超过对应类型的范围时,就不会产生错误。然而,其他类型的字面量(如:short,long,char,double等等)是没有这个功能的。
相关文章推荐
- JAVA使用POI操作excel
- 深入浅出RxJava三-响应式的好处
- Java内存管理原理及内存区域详解
- java 编码习惯整理
- 深入浅出RxJava二--操作符
- Spring MVC Internationalization (i18n) and Localization (i10n) Example
- 深入浅出RxJava(一:基础篇)
- Eclipse 安装插件后不显示的解决办法
- java --threadgroup线程组与UncaughtExceptionHandler
- springmvc配置Ehcache实现缓存管理
- 在一段英文字母中找出每个字母重复数量的方法(Java)
- Java编程思想重点笔记(Java开发必看)
- Spring IoC容器
- Java注释Override、Deprecated、SuppressWarnings详解
- Java中回调函数的使用
- Spring注解@Component、@Repository、@Service、@Controller区别
- java sound
- 使用内省完成JavaBean到集合的封装
- JAVA泛型? T K V E等代表的意思
- 精选30道Java笔试题解答