java:关于short s1=1;s1=s1+1;short s1=1;s1+=1;short s3=s1+s2;中存在的简单数据类型转换问题的理解
2015-03-24 18:00
585 查看
脱离了开发环境的提示,发现自己对有些java的基础东西掌握的都不扎实,今天看到一个关于java数据类型转换部分的面试题。
面试题的内容大概是这样:short s1=1;s1=s1+1;这两句代码有什么问题?short s1=1;s1+=1;这两句代码有什么问题?short s1=1,s2=1;short s3=s1+s2;这两句代码有什么问题?
下面我就对这三个问题按照自己的理解以及参考做出解释:
解释之前先说一些java中的基本数据类型转换的规则:高位转地位需要强制转换,地位转高位是自动转换,表达式两侧的转换规则是向左边的类型看齐。
一、short s1=1;s1=s1+1;
这两句代码的s1=s1+1存在数据类型转换问题,表达式右边:s1是short型,1是int型(1会被自动归为int型),二者相加,首先s1会被自动转为int型,相加的结果也就为int型。然而表达式的左边:s1是short型。此时就需要把表达时的右侧的数据类型强制转换为shor型,所以s1=s1+1;存在问题,会报出编译错误,正确的写法应该是s1=(short)(s1+1);
二、short s1=1;s1+=1;
首先说一下,这两句代码没有编译错误,结果也是正确的,那么,
有些人看到这两句代码会说,这个和刚才不是一样的吗,如果简单的认为s1+=1和s1=s1+1完全相同,那就错了。java语言规范中关于复合赋值的解释是这样的:E1 op=E2等价于
E1=(T)(E1 op E2),这里的T是E1的数据类型,看到这里 ,大家应该豁然开朗了,原来这个复合赋值是自带了隐式的强制类型转换的。
三、short s1=1,s2=1;short s3=s1+s2;
这两句代码也有编译错误,有些人会说了,难道同类型的数据还需要类型转换?答案是否定的,那么这里为什么会有编译错误呢,报错的原因主要是从数据安全方面考虑的,s1+s2的默认类型是int,因为如果s1的值接近short类型取值范围的最大值,同时s2的值也接近short类型取值范围的最大值,那么s1+s2的肯定超出了short的取值范围,此时二者之和就是int型的数据,此时就需要强制把左边的int型数据转换为右边的short型。有些人又说了,我明明写的s1为1,s2也为1,那为什么还报错,呵呵呵呵,因为此时还不知道s1和s2的值到底是多少,此处省去n个字。所以这两句代码正确的写法应该是short
s1=1,s2=1;short s3=(short)(s1+s2);
面试题的内容大概是这样:short s1=1;s1=s1+1;这两句代码有什么问题?short s1=1;s1+=1;这两句代码有什么问题?short s1=1,s2=1;short s3=s1+s2;这两句代码有什么问题?
下面我就对这三个问题按照自己的理解以及参考做出解释:
解释之前先说一些java中的基本数据类型转换的规则:高位转地位需要强制转换,地位转高位是自动转换,表达式两侧的转换规则是向左边的类型看齐。
一、short s1=1;s1=s1+1;
这两句代码的s1=s1+1存在数据类型转换问题,表达式右边:s1是short型,1是int型(1会被自动归为int型),二者相加,首先s1会被自动转为int型,相加的结果也就为int型。然而表达式的左边:s1是short型。此时就需要把表达时的右侧的数据类型强制转换为shor型,所以s1=s1+1;存在问题,会报出编译错误,正确的写法应该是s1=(short)(s1+1);
二、short s1=1;s1+=1;
首先说一下,这两句代码没有编译错误,结果也是正确的,那么,
有些人看到这两句代码会说,这个和刚才不是一样的吗,如果简单的认为s1+=1和s1=s1+1完全相同,那就错了。java语言规范中关于复合赋值的解释是这样的:E1 op=E2等价于
E1=(T)(E1 op E2),这里的T是E1的数据类型,看到这里 ,大家应该豁然开朗了,原来这个复合赋值是自带了隐式的强制类型转换的。
三、short s1=1,s2=1;short s3=s1+s2;
这两句代码也有编译错误,有些人会说了,难道同类型的数据还需要类型转换?答案是否定的,那么这里为什么会有编译错误呢,报错的原因主要是从数据安全方面考虑的,s1+s2的默认类型是int,因为如果s1的值接近short类型取值范围的最大值,同时s2的值也接近short类型取值范围的最大值,那么s1+s2的肯定超出了short的取值范围,此时二者之和就是int型的数据,此时就需要强制把左边的int型数据转换为右边的short型。有些人又说了,我明明写的s1为1,s2也为1,那为什么还报错,呵呵呵呵,因为此时还不知道s1和s2的值到底是多少,此处省去n个字。所以这两句代码正确的写法应该是short
s1=1,s2=1;short s3=(short)(s1+s2);
相关文章推荐
- java:关于short s1=1;s1=s1+1;short s1=1;s1+=1;short s3=s1+s2;中存在的简单数据类型转换问题的理解
- java中数据类型(short 和int)转换问题的理解
- 数据类型转换:short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1=1,s2=1;short s3=s1+s2;
- 关于JAVA中的基本数据类型的转换相关问题
- 关于java中long类型的数据转换json传到前台时丢失精度问题的解决办法
- 关于一道简单的Java 基础面试题的剖析: short s1=1;s1 = s1 +1会报错吗?
- 关于ArrayList类型转换的问题_java可以为啥c#不行
- 关于2147217913 从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界 的问题解决方法
- 两个有趣的关于java里基本类型转换的问题
- 关于java 基本数据类型之间的转换
- 关于一道简单的Java 基础面试题的剖析: short s1=1;s1 = s1 +1会报错吗?
- java Byte和各数据类型(short,int,long,float,double)之间的转换
- 关于Flex 和java之间利用Blazeds通信的类型转换问题
- 关于内存和指针操作,数据类型转换本质的理解
- C# winform关于datagridview中的列的数据类型转换问题
- 关于sql条件语句where id in (@参数)执行报错问题(转换成数据类型 int 时失败)(
- 关于Java中各种数据类型的转换
- 关于float double的数据类型的细节,在处理转换问题的时候非常有用
- 简单问题(1)---数据类型转换的潜规则
- 关于java基本数据类型之间的转换