有2个字节的数组: private byte [] 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认为它们不相等?而且,实现这些类的正确方法是什么?
答案 0 :(得分:2)
来自biziclop
的评论是正确的。
除非另有说明,否则您在代码中指定的任何整数编号都被视为整数。
将您的断言更改为:
Assert.assertEquals((byte)0xFF, word.getByte(1))
它应该传递正常 - 因为integer
的前两个字节将被视为a
byte
。
Bitwize speeking - 基本上当您编写0xFF
时,编译器将其解释为0x000000FF
255
。
您希望0xFFFFFFFF
为-1
。
转换为字节是正确的解决方案
答案 1 :(得分:2)
Java不支持无符号类型,因此为了使值为255,它不能是有符号的字节,它不能保持255的值.0xFF常量值将被视为有符号的int,并且为了进行比较,字节值0xFF也将转换为-1的int。
您需要将文字0xFF类型转换为字节。将断言更改为Assert.assertEquals((byte)0xFF, word.getByte(1));
然后左侧将评估为-1以及右侧。
答案 2 :(得分:1)
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