理解Java无符号数

我想了解如何将有符号数转换为无符号数。

让我说我有这个:

byte number = 127; // '1111111' 

为了使它无符号,我必须选择“更大”的数据类型“short”并应用值为0x00ff的AND运算符。

 short number2; number2 = number & 0x00ff; 

为什么这个号码没有签名?

Java实际上没有无符号的原语。

值127实际上由’01111111’表示,第一位是符号(0是正的)。

无符号字节可以保存0到255的值,但127是有符号字节的最大值。 由于一个字节有8位,而有一个字节消耗一个来保持符号。 因此,如果要表示大于127的值,则需要使用具有更多位数的更大类型。 较大的类型也有一个保留位用于符号,但它至少有8位用于实际值,因此您可以表示值255。

话虽这么说,你应该避免使用byte和short,因为它们存在问题。 您会注意到我将结果转换为short,因为运算符实际上返回int。 你应该坚持使用java中的int和long,因为它们的实现更好。

编辑:AND运算符使其无符号,因为符号位是short的第一位,并且将保存字节值的8位复制到short的最后8位。 因此,如果您有一个负数,则第一位为1(表示它为负)实际上成为该值的一部分。 并且短路将始终是正的,因为它的符号位是2的幂的两个高,受短路影响。

  byte: 10101101 

| <- actual value short: 0000000010101101

<- actual value

编辑2:请记住,因为负值使用二进制补码表示,该值可能不是您所期望的。 所有正值都保持不变。
但-128 = 0x10000000将变为128
-127 = 0x10000001将变为129
依此类推,直到-1 = 0x11111111,这将变为255

java没有无符号数据类型。 你只需切换到“更大”的数据类型即可。

如果你只是从负字节移动到int,int也将是负数。 你采取负int(或你的例子中的短)并将最高3字节(int)设置为0x00。