【Java】readUnsignedShort()与readShort()
readUnsignedShort()与readShort()区别
主要区别在于他们处理读取的两个字节的方式以及返回值类型和范围
1. 返回值类型
readUnsignedShort()
- 返回值是
int
类型 - 他将两个字节组合成一个无符号的
16
位整数,返回值范围是0
到65535
(即2^16 - 1
)
readShort()
- 返回值是
short
类型 - 他将两个字节组合成一个有符号的
16
位整数,返回值为-32768
到32767
(即-2^15
到2^15 -1
)
2. 数据解释方式
readUnsignedShort()
- 将两个字节视为无符号的数据
- 高字节(第一个字节)左移
8
位,低字节(第二个字节)直接相加return (ch1 << 8) + (ch2 << 0);
- 结果是一个非负的(
int
类型),范围从0
到65535
readShort()
- 将两个字节视为有符号数据
- 同样的通过右移
8
位、地位字节直接相加,但最终的会被强制转换为short
类型return (short) ((ch1 << 8) + (ch2 << 0));
实例对比
假设我们从流中读取两个字节,0xFF
和 0x7F
readUnsignedShort()
计算过程如下,返回值为65407
(无符号)
ch1 = 0xFF (255), ch2 = 0x7F (127)
result = (ch1 << 8) + (ch2 << 0)
= (255 << 8) + (127 << 0)
= 65280 + 127
= 65407
readShort() 计算过程如下
ch1 = 0xFF (255), ch2 = 0x7F (127)
result = (short) ((ch1 << 8) + (ch2 << 0))
= (short) (65280 + 127)
= (short) 65407
由于short是有符号类型,65407
超过了short
的正数范围,会被解释为负数:
result = -129
特性 | readUnsignedShort() | readShort() |
---|---|---|
返回值类型 | int | short |
数据范围 | 0到65535 | -32768 到 32767 |
符号处理 | 无符号(不会出现负数) | 有符号(可能出现负数) |
适用场景 | 解析非负数 | 解析可能出现负数的数据 |