java:关于short s1=1;s1=s1+1;short s1=1;s1+=1;short s3=s1+s2;中存在的简单数据类型转换问题的理解

原创 2015年03月24日 18:00:16

脱离了开发环境的提示,发现自己对有些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);



java:关于short s1=1;s1=s1+1;short s1=1;s1+=1;short s3=s1+s2;中存在的简单数据类型转换问题的理解

脱离了开发环境的提示,发现自己对有些java的基础东兴掌握的都不扎实,今天看到一个关于java数据类型转换部分的面试题。 面试题的内容大概是这样:short s1=1;s1=s1+1;这两句代码有什么...
  • huanongjingchao
  • huanongjingchao
  • 2015年03月24日 18:00
  • 2520

面试题:short s1=1;s1=s1+1;有什么错?short s2=1;s2+=1;有什么错?

/* * short s1=1;s1=s1+1;有什么错? * short s2=1;s2+=1;有什么错? * long l1 = 1;l1 = l1+1;有什么错? * long l2 =...
  • u012110719
  • u012110719
  • 2015年06月01日 21:14
  • 2109

java中short s1 = 1;s1 = s1 + 1;会出错而short s1+=1;能编译通过的原因

最近看到一道关于java中运算符和类型转换的笔试题,虽然很基础,但是也是一个很经典的问题,所以在这里进行总结。问题描述: 问: (1) short s1 = 1;...
  • yyg_2015
  • yyg_2015
  • 2016年06月08日 17:33
  • 513

Java中short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

s1 = s1 + 1;这句是错误的,s1是short类型,占2个字节,而s1+1自动类型转化为int类型,占4个字节,然后赋给一个short类型变量s1,就要丢失2个字节的精度,这是不允许的。如果非...
  • xiaoyu714543065
  • xiaoyu714543065
  • 2012年10月30日 16:31
  • 1399

short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?【Java面试题】

先说一下Java的基本数据类型转换规则,大的数据类型转换为小的数据类型需要强制转换,反之可以自动转换。 赋值表达式等号两侧的转换的规则是右侧的向左侧的看齐,即右侧表达式要转换到和左边的类型一样。 ...
  • L_BestCoder
  • L_BestCoder
  • 2017年08月25日 14:19
  • 275

short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型) short s1 = 1; s1 += 1;(可以正确编译)...
  • owenliu563
  • owenliu563
  • 2014年03月09日 13:06
  • 976

short s1 = 1; s1 = s1 + 1;与short s1 = 1;

1. short s1=1;s1=s1+1;为什么是错的 在进行算法运算的时候,内部CLR的虚拟机只能进行最低32位的运算 也就是int 所以不管你是short+short 还是byte+sh...
  • u013361361
  • u013361361
  • 2014年02月13日 12:15
  • 568

数据类型转换:short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1=1,s2=1;short s3=s1+s2;

一个基础的数据类型转换问题,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 。第一眼看这个问题,能想到数据类型转换、 s1 = ...
  • maoyuanming0806
  • maoyuanming0806
  • 2017年09月18日 09:40
  • 290

short s1=1;s1=s1+1;有什么错?short s1=1;s1+=1;有什么错?

short s1=1;s1=s1+1;有什么错?short s1=1;s1+=1;有什么错? 当使用+=、-=、*=、/=、%=、运算符对基本类型进行运算时,遵循如下规则: • 运算符右边的数值将...
  • appleheshuang
  • appleheshuang
  • 2012年08月20日 21:50
  • 1077

short s1 = 1; s1 = s1 + 1;

 s1=s1+1和s1+=1是有区别的。 s1=s1+1会错因为s1是short,而1是int,所以运算时会自动转换为int,再将int赋值给s1是需要强制转换,所以会错。 JAVA规范上说e1+=e...
  • run_forever1987
  • run_forever1987
  • 2011年04月11日 11:56
  • 418
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java:关于short s1=1;s1=s1+1;short s1=1;s1+=1;short s3=s1+s2;中存在的简单数据类型转换问题的理解
举报原因:
原因补充:

(最多只允许输入30个字)