`
Damon_Zhang
  • 浏览: 71891 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

short s1 = 1;int i = 1; s1 = s1+i; s1+=i;

    博客分类:
  • Java
阅读更多
对两个容量不一样的数据类型的变量进行算术运算时,java会自动将小容量的变量进行精度提升,然后再进行运算,得到的结果类型是提升后的大容量的数据类型.如果将该结果赋值给小容量的数据类型的变量,则必须进行强制的类型转换,否则编译程序会报损失精度错.如楼主示例,用i来表示1:
short s1 = 1;
int i = 1;
首先,因为short类型是16位的,而int类型是32位的,在进行
(s1+i) 运算时,自动将s1提升到32位,然后与i相加,得到的结果是32位的,而此时
s1=s1+i; 必然报错,因为如果赋值成功,只是把低16位赋给了s1,这个虽然正是楼主想要的结果,但是编译程序却不能判定你的意图是什么.
执行强转:
s1=(short)(s1+i); 就没问题了.
s1+=i;能编译通过并得到正确结果,而 s1=s1+i; 却报错,是因为它们并不像楼主认为的那样是等价的,s1+=i的方式java会对i进行窄化转换,由编译程序自动执行.
java规范中说:
E1 op=E2 实际上等价于 : E1=(T)( (E1)op(E2) )
其中T是E1的数据类型.这种类型转换或者是一个恒等转换,或者是一个窄化转换.
这个说明java是一种强类型的语言,对数据类型的要求是非常严格的,否则会引起混乱.
下面解释一下三种类型转换:恒等转换(相同容量的两个数据类型之间的赋值);拓宽转换(小容量类型赋值给大容量类型);窄化转换(大容量赋值给小容量类型). 实际上,前两种转换都是编译程序自动执行的,而窄化转换则要求必须显式的执行.
分享到:
评论

相关推荐

    java面试题(题库全).doc

    s1+1 运算结果是 int 型,需要强制转换类型;short s1 = 1; s1 += 1;可以正确编译,自动类型提升。 7. Java 有没有 goto? goto 是 java 中的保留字,现在没有在 java 中使用。 8. int 和 Integer 有什么区别? ...

    java面试宝典

    `会导致编译错误,因为`s1 + 1`的结果自动提升为`int`类型,需要显式转换回`short`类型。 - `short s1 = 1; s1 += 1;`则可以正确编译,因为复合赋值运算符`+=`会自动处理类型转换。 #### 七、`char`类型与汉字存储...

    java面试题,从基础到框架再到设计

    s1+1 运算结果是 int 型,需要强制转换类型;short s1 = 1; s1 += 1;可以正确编译,自动类型提升。 Java 基础 7. Java 有没有 goto? 答:goto 是 java 中的保留字,现在没有在 java 中使用。 8. int 和 Integer ...

    java知识.pdf

    ### Java基础知识精讲 #### 一、源文件中类的数量及命名... s1=(short)(s1+1);`。如果不进行显式转换,编译器会报错,提示类型不匹配。 以上内容涵盖了Java基础知识的重要方面,希望对理解和掌握Java编程有所帮助。

    Java最新面试宝典

    ` 会产生编译错误,因为 `s1 + 1` 的结果会被自动提升为 `int` 类型,再赋值给 `short` 类型时需要显式转换。 - `short s1 = 1; s1 += 1;` 编译正确,因为 `+=` 运算符由 Java 特别处理,能够自动处理类型转换。 **...

    java面试精华6

    `,由于`s1 + 1`运算时会自动提升表达式的类型至`int`,再赋值给`short`类型`s1`时会导致编译错误,因为需要显式地进行类型转换。 - 对于`short s1 = 1; s1 += 1;`,由于`+=`是Java语言规定的运算符,Java编译器会...

    Java面试宝典

    6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 9 7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用...

    Java面试宝典 葵花宝典

    `会因为隐式类型提升产生错误,因为`s1 + 1`的结果是`int`类型,需要显式转换回`short`:`short s1 = 1; s1 = (short)(s1 + 1);` - `short s1 = 1; s1 += 1;`是正确的,因为Java编译器会自动处理这种类型的转换。 ...

    2023年最新:BAT大厂-java经典必考面试题

    可以正确编译,因为 s1+= 1;相当于 s1 = (short)(s1 + 1);其中有隐含的强制类型转换。 Java 中没有使用 goto 语句,goto 是 Java 中的保留字。 在 Java 中,类的成员变量和方法都可以被继承,继承的目的是为了...

    Java就业面试题大全.doc

    会产生编译错误,因为 s1+1 运算时会自动提升表达式的类型,所以结果是 int 型,再赋值给 short 类型 s1 时,编译器将报告需要强制转换类型的错误。short s1 = 1; s1 += 1; 可以正确编译,因为 += 是 java 语言规定...

    Java基础面试题.doc

    `,这里由于1默认是int类型,所以s1+1的结果是int,需要显式转换回short类型。 3. **运算符和表达式**:在Java中,+=运算符会自动处理类型转换,例如`short s1 = 1; s1 += 1;`。这里的s1+=1等价于`s1 = (short)(s1 ...

    java笔试题目以及部分答案

    错误,因为 s1 + 1 将产生一个 int 类型的结果,不能赋值给 short 类型的变量。short s1 = 1; s1 += 1; 正确,因为 += 运算符将自动转换结果为 short 类型。 12. sleep() 和 wait() 有什么区别? sleep() 和 wait...

    Java面试题全集.docx

    Java 面试题全集 ...答案是不错误的,s1+= 1;相当于 s1 = (short)(s1 + 1);其中有隐含的强制类型转换。 4. Java 有没有 goto?答案是有,但是目前版本的 Java 中没有使用goto 是 Java 中的保留字。

    最新Java面试题及答案整理.docx

    是错误的,因为1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。 short s1 = 1; s1 += 1;是正确的,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。 本文总结了...

    java笔试面试试题附带答案

    错误在于:`s1 + 1`的结果会被隐式提升为`int`类型,因此不能直接赋值给`short`类型的变量。解决方法是显式类型转换:`s1 = (short)(s1 + 1);` **2.3 `int`和`Integer`都可以代表一个整数,为什么JDK设计了这两个...

    java 面试必考面试题

    会编译错误,因为 s1+ 1 运算时会自动提升表达式的类型,所以结果是 int 型,再赋值给 short 类型 s1 时,编译器将报告需要强制转换类型的错误。short s1 = 1; s1 += 1; 则可以正确编译,因为 += 是 Java 语言规定...

    Java面试宝典面试资源文档

    当尝试将这个`int`类型的结果赋值给`short`类型的`s1`时,编译器会报错,提示需要进行类型转换。 对于`short s1 = 1; s1 += 1;`,因为`+=`是Java语言中预定义的运算符,编译器会自动进行类型转换处理,所以这条语句...

Global site tag (gtag.js) - Google Analytics