问题描述
|
有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