我希望了解如何将有符号数转换为无符号数。
假设我有以下内容:
byte number = 127; // '1111111'
为了使其无符号,我必须选择“更大”的数据类型“short”,并使用值0x00ff应用AND运算符。
short number2;
number2 = number & 0x00ff;
为什么会将数字变成无符号数?
Java实际上没有无符号的基本类型。
值127实际上由“01111111”表示,第一个位是符号(0为正数)。
无符号字节可以保存0到255之间的值,但127是有符号字节的最大值。由于一个字节有8个位,有符号的字节消耗一个位来保存符号。因此,如果您想表示大于127的值,则需要使用具有更多位数的更大类型。更大的类型也有一个保留位用于符号,但至少有8个位用于实际值,因此您可以表示值255。
话虽如此,在Java中应该避免使用byte和short,因为它们存在问题。你会注意到我将结果转换为short,因为运算符实际上返回int。在Java中,您应该只使用int和long,因为它们的实现更好。
编辑:AND运算符使其无符号,因为符号位是short的第一位,并且您将包含字节值的8位复制到short的最后8位。因此,如果您有一个负数,第一个位是1(这意味着它是负数),实际上成为值的一部分。而short始终为正数,因为它的符号位太高的2的幂,因此不受short影响。
byte: 10101101
||||||| <- actual value
short: 0000000010101101
||||||||||||||| <- actual value
编辑2:请注意,由于负值使用二进制补码表示法,所以值可能与您预期的不同。所有正值保持不变。
但是,-128 = 0x10000000将变为128
-127 = 0x10000001将变为129
依此类推,直到-1 = 0x11111111,它将变为255
Java没有无符号数据类型。你只需要转换为“更大”的数据类型,就可以了。
如果你只是从负字节转换为整数,那么整数也将是负数。因此,你需要取负整数(或在你的示例中为短整型),并将最高的3个字节(整数)设置为0x00。