【发布时间】:2013-01-02 20:55:36
【问题描述】:
我正在解析来自 DatagramSocket 的无符号位。我总共有 24 位(或 3 个字节)进入 - 它们是:1 个无符号 8 位整数,后跟一个 16 位有符号整数。但是java从不将任何超过有符号字节的内容存储到字节/字节数组中?当 java 接受这些值时,你会丢失最后的第 8 位吗?
DatagramSocket serverSocket = new DatagramSocket(666);
byte[] receiveData = new byte[3]; <--Now at this moment I lost my 8th bit
System.out.println("Binary Server Listing on Port: "+port);
while (true)
{
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
byte[] bArray = receivePacket.getData();
byte b = bArray[0];
}
自从我把它变成一个字节后,我现在是否丢失了这第 8 位?我初始化了一个 3 字节的字节数组是不是错了?
【问题讨论】:
-
我希望有无符号变量(不仅仅是
char)会使一些代码更容易,并允许编译器进行一些优化,仅对无符号值有效。 -
@MrSmith 编译器可以做它需要做的任何事情,因为所有对有符号值的操作在 Java 中都是明确定义的。
-
@starblue:我的意思是对于无符号值,允许进行一些优化,而对于有符号值是不允许的。例如
a % 4可以优化为仅对正数有效的a & 2。 => 不允许 javacompiler 进行这种优化,即使开发人员只使用正数。 -
@MrSmith 你说得对,无符号除法是少数几个不容易用有符号数的运算来模拟的事情之一。 Java 8 将通过添加无符号数的缺失操作来解决这个问题:blogs.oracle.com/darcy/entry/unsigned_api
标签: java bit-manipulation