Java中long转int与int转short的类型转换差异及代码疑问
问题解答
一、为什么short t=(short)1 * 3 ;可行,而int tadpole = (int)5 * 2L ;编译报错?
核心是运算符优先级和Java赋值转换规则的差异:
第一个语句的执行逻辑:
- 强制类型转换
(short)优先级高于乘法*,先将1转为short类型。 - 随后执行乘法运算
1 * 3,根据Java规则,byte/short/char参与算术运算时会自动提升为int,运算结果是int类型的3。 - 最后将int类型的
3赋值给short变量t:因为3是编译时常量,且值落在short的取值范围(-32768~32767)内,Java允许这种常量表达式的隐式窄化转换,因此编译通过。
- 强制类型转换
第二个语句的执行逻辑:
- 先执行
(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
相关产品推荐
相关产品推荐

