Java - 无符号值的奇怪错误

时间:2011-06-21 21:48:58

标签: java junit unsigned short

有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认为它们不相等?而且,实现这些类的正确方法是什么?

3 个答案:

答案 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