短整型 short
本章定位:short是16位有符号整数类型,取值范围-32768~32767。在飞翔科技的旅游系统中,short常用于年龄限制、年份、限高等"刚好不超过三万"的数据。小崔曾好奇为什么很少见人用short,白歌解释:现代JVM对int优化更好,short更多用于JNI交互和特定协议字段。
定义与语法
| 属性 | 说明 |
|---|---|
| 关键字 | short(短整型) |
| 位数 | 16 bits(2字节) |
| 表示法 | 有符号二进制补码 |
| 取值范围 | -32768 ~ 32767(即 -2¹⁵ ~ 2¹⁵-1) |
| 默认值 | 0 |
| 包装类 | java.lang.Short |
基本声明
short minAge = 18; // 购物年龄限制
short travelYear = 2018; // 出行年份
short minHeight = 120; // 最低身高要求120cm
short maxWeight = 150; // 最大体重150kg
short examScore = 100; // 考试满分100分
short heartRate = 72; // 心率72次/分
深度原理:short的16位二进制世界
与 byte 的继承关系
short可以安全接收byte的所有值(widening自动转换),但short到int也是自动转换。这就是Java的类型提升路径。
完整代码示例
示例一:飞翔旅游系统的short应用
/**
* 飞翔科技 - short 类型演示
* 场景:飞翔旅游平台的出行信息(年龄、年份、限高都在short范围内)
*/
public class ShortTravelDemo {
public static void main(String[] args) {
// 旅游场景数据
short travelYear = 2018; // 出行年份
short minHeight = 120; // 最低身高120cm
short maxWeight = 150; // 最大体重150kg
short dailyVisitorLimit = 1000; // 日限流(short最大32767,够用)
// 游客信息
short visitorAge = 25;
short visitorHeight = 175;
short visitorWeight = 68;
// 资格校验
boolean ageOk = visitorAge >= 18;
boolean heightOk = visitorHeight >= minHeight;
boolean weightOk = visitorWeight <= maxWeight;
boolean allOk = ageOk && heightOk && weightOk;
System.out.println("【飞翔旅游 - 景区资格校验】");
System.out.println("出行年份:" + travelYear + "年");
System.out.println("游客年龄:" + visitorAge + "岁 " + (ageOk ? "✓" : "✗需满18岁"));
System.out.println("游客身高:" + visitorHeight + "cm " + (heightOk ? "✓" : "✗最低" + minHeight + "cm"));
System.out.println("游客体重:" + visitorWeight + "kg " + (weightOk ? "✓" : "✗最大" + maxWeight + "kg"));
System.out.println("日限流:" + dailyVisitorLimit + "人");
System.out.println("综合结果:" + (allOk ? "允许参与" : "不满足条件"));
System.out.println("\n【类型信息】");
System.out.println("short 最小值:" + Short.MIN_VALUE);
System.out.println("short 最大值:" + Short.MAX_VALUE);
System.out.println("short 位数:" + Short.SIZE + " bit");
}
}
运行输出:
【飞翔旅游 - 景区资格校验】
出行年份:2018年
游客年龄:25岁 ✓
游客身高:175cm ✓
游客体重:68kg ✓
日限流:1000人
综合结果:允许参与
【类型信息】
short 最小值:-32768
short 最大值:32767
short 位数:16 bit
示例二:short运算中的自动提升
/**
* 飞翔科技 - short 运算演示
* 场景:小崔计算运动心率范围,发现short+short结果是int
*/
public class ShortOperationDemo {
public static void main(String[] args) {
short baseHeartRate = 72; // 静息心率
short exerciseRate = 135; // 运动心率
short maxSafeRate = 180; // 最大安全心率
// short 运算自动提升为 int
// short sum = baseHeartRate + exerciseRate; // 编译错误!
int totalRate = baseHeartRate + exerciseRate; // int 接收
// 需要 short 结果时强制转换
short avgRate = (short) ((baseHeartRate + exerciseRate) / 2);
// short 的比较运算也自动提升
boolean isSafe = exerciseRate < maxSafeRate;
System.out.println("【飞翔运动 - 心率分析】");
System.out.println("静息心率:" + baseHeartRate + " 次/分");
System.out.println("运动心率:" + exerciseRate + " 次/分");
System.out.println("合计心率:" + totalRate + " 次/分(int类型)");
System.out.println("平均心率:" + avgRate + " 次/分(强转回short)");
System.out.println("安全范围内:" + isSafe);
System.out.println("最大安全心率:" + maxSafeRate + " 次/分");
}
}
运行输出:
【飞翔运动 - 心率分析】
静息心率:72 次/分
运动心率:135 次/分
合计心率:207 次/分(int类型)
平均心率:103 次/分(强转回short)
安全范围内:true
最大安全心率:180 次/分
易错场景
反例一:short 字面量越界
// ❌ 错误:32768 超出 short 最大值 32767
short value = 32768; // 编译错误:incompatible types: possible lossy conversion from int to short
// ✅ 正确:在范围内
short value = 32767; // 合法
反例二:short 运算忘记强转
// ❌ 错误:short 运算结果是 int,不能直接赋给 short
short a = 100;
short b = 200;
short sum = a + b; // 编译错误
// ✅ 正确:强转或改用 int
short sum = (short) (a + b); // 方式一:强转
int sumInt = a + b; // 方式二:直接用int(推荐)
反例三:short 溢出(溢出到负数)
// ❌ 危险:short 最大值 32767 + 1 = -32768(溢出回绕)
short max = 32767;
short overflow = (short) (max + 1);
System.out.println(overflow); // 输出 -32768(不是期待的 32768)
// ✅ 正确:用更大类型 int 存储
int safeValue = max + 1; // 32768
适用场景与为何不常用
| 场景 | 示例 | 原因 |
|---|---|---|
| TCP/UDP端口号 | short port = 8080; | 端口号0~65535,但Java的short有符号 |
| 年龄/年份 | short age = 25; | 范围足够 |
| JNI本地方法交互 | short nativeValue; | 与C的short对应 |
| 大数组节省内存 | short[] arr = new short[10000]; | 相比int数组节省50%内存 |
| 文件格式/协议字段 | 读取固定16位字段 | 二进制文件解析 |
白歌点评:"现代JVM(特别是64位JVM)对32位
int的操作做了极致优化,而short需要额外的符号扩展指令,反而可能更慢。除了和C/C++交互、解析二进制协议或节省大数组内存,优先用int。"
面试考点
Q1:short的取值范围为什么是-32768到32767?
short是16位有符号二进制补码。16位共有2¹⁶=65536个值。补码编码中,正数+零占32768个(0~32767),负数占32768个(-1~-32768)。与byte同理,最高位是符号位,
10000000 00000000被约定为-32768。
Q2:short s1 = 1; s1 = s1 + 1; 有什么错?short s1 = 1; s1 += 1; 呢?
s1 = s1 + 1编译错误,因为s1 + 1中s1先提升为int,结果也是int,不能直接赋给short。s1 += 1编译通过,因为复合赋值运算符(+=)内置了隐式强制类型转换,等价于s1 = (short)(s1 + 1)。
Q3:short在实际开发中为什么用得不多?
①现代64位JVM对int操作有最优的硬件指令支持,short需要额外的符号扩展;②short范围较小(±3万),容易溢出;③默认整数字面量是int,使用short需要频繁强转,代码不简洁;④内存节省在大多数应用场景中微不足道(除非百万级数组)。因此Java社区约定"整数默认用int"。