gpt4 book ai didi

java - Java 中负字节和短数据类型的位操作

转载 作者:行者123 更新时间:2023-12-01 18:12:11 24 4
gpt4 key购买 nike

我正在尝试实现一个存储 32 位数字的类,而不使用 int原始类型。为此,我使用了两个 short变量msbslsbs存储数字的 32 位,每个变量 16 位。变量msbs将存储数字的前 16 位和 lsbs变量剩下的 16 位。

当涉及到将给定字节保存到变量时,我应用下一个公式:(字节顺序以 Little-Endian 表示法给出)

输入-> byte[] n = {0b00110101, -3, 0b1001, 0b0};到号码 0b00000000 00001001 11111101 00110101 (654645)

msbs = ((n[3] << 8) | n[2]);
lsbs = ((n[1] << 8) | n[0]);

如下图

private void saveNumber(byte[] n) {
msbs = (byte)((n[3] << 8) | n[2]);
lsbs = (byte)((n[1] << 8) | n[0]);

System.out.println(Integer.toBinaryString((n[1] << 8) | n[0]));//Prints 11111111111111111111110100110101

System.out.println("msbs -> " + Integer.toBinaryString(msbs));
System.out.println("lsbs -> " + Integer.toBinaryString(lsbs));//Prints 110101
}

线路

System.out.println(Integer.toBinaryString((n[1] << 8) | n[0]));//Prints 11111111111111111111110100110101

打印出我所需要的内容,尽管开头有大量无用的 1 位(我可以通过将其转换为 short 来摆脱它们)但是当我打印lsbs时我存储完全相同的值(显然)它输出 110101,而它应该是 0b1111110100110101

为什么会出现这种行为?我知道这一定是 Java 在存储值 11111111111111111111110100110101 时执行的“内部”转换。转换为 16 位原始类型(我个人认为这不会发生,因为我在 8 位数字中向左移动 8 位,这应该给我一个 16 位数字)作为旁注,msbs变量正在做我想要它做的事情,所以问题应该与Java表示负数的方式有关

顺便说一句,我知道 Java 并不是享受位乐趣的最佳语言。

最佳答案

Why does this behavior occur?

在Java中,所有按位运算都是32位或64位运算。这与其他一些语言不同,并且可能是意想不到的。但事实就是如此。

I understand It must be something with the "internal" casting performed by Java ....

Java 不会在您的任何示例中执行隐式缩小转换1。事实上,我认为意外行为的原因是代码中的显式缩小:

  msbs = (byte)((n[3] << 8) | n[2]);

您已从 ((n[3] << 8) | n[2]) 显式转换了一个 32 位值到 byte 。根据您所说的期望,您应该转换到 short .

<小时/>

旁白:当您写下这样的内容时,“就我个人而言,我认为这不会发生......”,这意味着您怀疑 Java 编译器的正确性。事实上,在 99.999% 的情况下2,真正的问题是有人不明白编译器应该如何处理他们的;即他们的语言知识太浅3。在大多数情况下,编程语言都有一个规范,它准确地说明了特定构造的含义。对于 Java 来说,它是 Java 语言规范。

<小时/>

1 - 事实上,我能想到的原始类型发生内部缩小的唯一情况是在赋值运算符中。

2 - 我编了这个数字,但重点是编译器错误很少是导致意外应用程序行为的原因。

3 - 或者这可能只是程序员错过的应用程序错误。疲劳会对大脑产生坏影响......

关于java - Java 中负字节和短数据类型的位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32161747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com