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);



相关文章推荐

一个老话题,short s=s+1的日常

最近又要重新捡起java了,因为没做过开发的it人生是不完整的,so,就从一个万年老梗 short s=s+1为何编译失败开始新的开始吧。 calss test { public stat...

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

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

s5pv210 i2c总线驱动s3c2410.c 完全解析1

对于学习嵌入式来说,i2c 协议肯定是必须重点掌握的,平时大家在工作学习中接触的tp,camera,sensor等很多外设都是iic接口的,在调试这些设备之时,我们不用去关心i2c总线驱动,因为芯片厂...

[kotlin系列] (s1_2)基本类型

Kotlin 基本类型

iPhone 5/4/4S iPad 1/2/3/mini 界面设计标准。

iPhone 4的实机尺寸有错误,应该和4S是同一规格尺寸,但用作开发尺寸是对的。实机尺寸是开发尺寸的2倍,请阅者注意...

GUI:图形用户界面 1、方法:void OnGUI(){} 2、标签 GUI.Lable(new Rect(left,top,witch,100),str); 3、文本输入域:s

第一个场景:    public class Welcome : MonoBehaviour {     public float left;     public float top;   ...

3Glasses D2/蓝珀S1兼容steam插件优化版

3Glasses D2/蓝珀S1兼容steam插件,本人根据反应的一些问题,对上一版插件做了优化,现在公布出来供大家下载研究使用。...
  • rodinvr
  • rodinvr
  • 2017年04月20日 11:19
  • 830

STM8S---TIM2产生PWM与TIM1定时器周期中断的时钟问题

1 问题  在下面的测试程序中,如果将Init_CLK()函数中的 CLK_CKDIVR |= 0x08;去掉’|‘,则TIM1的功能实现跟预设定相同(10ms中断一次),但是TIM2的PWM频率就变...
  • FreeApe
  • FreeApe
  • 2015年07月08日 12:48
  • 3705

Qt应用静态编译,静态链接,去mingwm10.dll,libgcc_s_dw2-1.dll依赖问题

完全了解逻辑层次os/compiler/framework/application中静态链接、动态链接情况的,请绕道。linux以及Xnux的大牛,也不用看了。要想Qt应用做出来只是一个exe就能给客...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java:关于short s1=1;s1=s1+1;short s1=1;s1+=1;short s3=s1+s2;中存在的简单数据类型转换问题的理解
举报原因:
原因补充:

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