短于int cast,奇怪的行为

Posted

技术标签:

【中文标题】短于int cast,奇怪的行为【英文标题】:short to int cast, weird behaviour 【发布时间】:2013-08-17 17:49:13 【问题描述】:

我目前从 ByteBuffer 读取一个短值并将其应用于 int。

byte[] data = new byte0x90, 0xAF;
ByteBuffer b = ByteBuffer.wrap(data);
int value = b.getShort();

value 现在包含 0xFFFF90AF 而不是 0x90AF。 我的解决方案是通过0xFFFF 对值进行位掩码:int value = b.getShort() & 0xFFFF;

我认为向上转换总是可能的,因为short 小于int。有人能解释一下为什么会这样吗?

【问题讨论】:

附注:shortint 不是 upcast,因为 int 不是 short 的超类型。这称为扩大转化 【参考方案1】:

short 已签名,并且在转换为 int 时会保留。 0x90AF 是负数short,所以结果是负数int。您的屏蔽解决方案是正确的。

【讨论】:

【参考方案2】:

short 是有符号数量,但你很幸运:还有 char,它是 Java 中唯一的 unsigned 原始类型,大小与 short 相同.尝试使用

int value = b.getChar();

char 是 Java 中成熟的数字类型,这是一个经常被忽视的事实。只是它的字符串表示暴露了它的特殊地位。

【讨论】:

以上是关于短于int cast,奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的 SIMD 指令行为

从Java访问元组的奇怪行为

奇怪的 PowerShell 递归行为

C++ 中的 if 语句行为真的很奇怪

奇怪的编译器行为 (C++)

双数据类型的奇怪行为