Java-带有无符号值的奇怪错误

问题描述

| 有2个字节的数组: 专用字节[] mData; 和方法
public void setWord(final short pData) {
        mData[0] = (byte) (pData >>> 8);
        mData[1] = (byte) (pData);
}
我写了简单的测试:
public void testWord() {
        Word word = new Word();
        word.setWord((short) 0x3FFF);

        Assert.assertEquals(0x3F,word.getByte(0));
        Assert.assertEquals(0xFF,word.getByte(1));
}
第二个断言失败,并显示消息“预期为255,但为-1”。 我知道,签名的0xFF短实际上为-1,但是JUnit为什么认为它们不相等?而且,实现此类的正确方法是什么?     

解决方法

        Java不支持无符号类型,因此为了使值成为255,它一定不能是有符号的字节,该字节不能保存255的值。0xFF常量值将被视为有符号的int,并且对于比较时,字节值0xFF也将转换为-1的int值。 您需要键入将字面量0xFF转换为字节。将assert更改为“ 2”,则左侧和右侧的取值为-1。     ,        
biziclop
的注释正确。 除非另有标记,否则您在代码中指定的任何整数均被视为整数。 将您的断言更改为:
Assert.assertEquals((byte)0xFF,word.getByte(1))
它应该可以通过-因为
integer
的前两个字节将被视为
byte
。 Bitwize Speeking-基本上,当您编写
0xFF
时,编译器会将其解释为
0x000000FF
,即
255
。 您要
0xFFFFFFFF
,即is11ѭ。 在这里强制转换为字节是正确的解决方案     ,        Java中没有未签名的类型。 0xFF是int 255,并且转换为字节溢出到-1。 如果我希望字节无符号,我通常将其作为整数使用。我通常这样做:
int b1 = getByte() & 0xFF;
例如:
byte byte1 = 0xFF; // 255 = -1
byte byte2 = 0xFE; // 254 = -2
int int1 = (byte1 & 0xFF) + (byte1 & 0xFF); // 255 + 254 = 509