You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中long转int与int转short的类型转换差异及代码疑问

问题解答

一、为什么short t=(short)1 * 3 ;可行,而int tadpole = (int)5 * 2L ;编译报错?

核心是运算符优先级和Java赋值转换规则的差异:

  1. 第一个语句的执行逻辑:

    • 强制类型转换(short)优先级高于乘法*,先将1转为short类型。
    • 随后执行乘法运算1 * 3,根据Java规则,byte/short/char参与算术运算时会自动提升为int,运算结果是int类型的3。
    • 最后将int类型的3赋值给short变量t:因为3是编译时常量,且值落在short的取值范围(-32768~32767)内,Java允许这种常量表达式的隐式窄化转换,因此编译通过。
  2. 第二个语句的执行逻辑:

    • 先执行(int)5得到int类型的5,再和2L(long类型)做乘法运算。不同类型运算时会自动提升为范围更广的类型,因此结果是long类型的10。
    • 把long类型的值赋值给int变量属于宽类型转窄类型,Java不允许这种隐式转换——编译阶段仅检查类型匹配性,不会判断具体数值,必须显式添加(int)强制转换才能通过编译。

二、为什么short x = (int) 30;可行,而int y = (long) 30;无法运行?

这是Java赋值转换规则的限定:

  • 对于short x = (int) 30;:
    (int)30是int类型的编译时常量,值30在short的取值范围内。Java规定:当源类型是byte/short/char/int的常量表达式,且值在目标窄类型的取值范围内时,可直接隐式转换赋值,无需额外强转,因此编译通过。

  • 对于int y = (long) 30;:
    (long)30是long类型的常量,虽然值30在int范围内,但Java的隐式窄化转换规则仅适用于源类型为byte/short/char/int的常量,long类型不在此范围内。将long转int属于宽转窄操作,必须显式添加(int)强制转换,否则编译报错。

内容的提问来源于stack exchange,提问作者Vishnu Vardhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:10:29