0

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

4

3 回答 3

2

Java 不支持无符号类型,所以要使一个值为 255,它必须不是有符号字节,它无法保存 255 的值。0xFF 常量值将被视为有符号 int,对于比较起来,字节值 0xFF 也将在 -1 处转换为 int。

您需要将文字 0xFF 键入为一个字节。将断言更改为Assert.assertEquals((byte)0xFF, word.getByte(1));然后左侧将评估为 -1 以及右侧。

于 2011-06-21T21:58:06.460 回答
2

来自的评论biziclop是正确的。除非另有标记,否则您在代码中指定的任何整数都被视为整数。

将您的断言更改为:

Assert.assertEquals((byte)0xFF, word.getByte(1))

它应该可以通过 - 因为前两个字节integer将被视为 byte.

Bitwize speeking - 基本上,当您编写0xFF编译器时,编译器会将其解释0x000000FF255. 你想要0xFFFFFFFF的是-1.

转换为字节是正确的解决方案

于 2011-06-21T21:54:10.747 回答
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
于 2011-06-21T21:56:24.990 回答