理解Java无符号数

时间:2010-08-02 13:28:59

标签: java byte unsigned

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

让我说我有这个:

byte number = 127; // '1111111'

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

short number2;  
number2 = number & 0x00ff;

为什么这个数字是无符号的?

3 个答案:

答案 0 :(得分:4)

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:请注意,由于负值使用two's complement representation,因此该值可能不是您所期望的。所有正值保持不变。
但-128 = 0x10000000将变为128
-127 = 0x10000001将变为129
依此类推,直到-1 = 0x11111111,这将变为255

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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