Java - странные ошибки с беззнаковыми значениями - PullRequest
0 голосов
/ 22 июня 2011

Имеется 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, подписанный short, на самом деле равен -1, но почему JUnit считает, что они не равны? И как правильно реализовать такие классы?

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

Java не поддерживает беззнаковые типы, поэтому для значения 255 это не должен быть байт со знаком, который не может содержать значение 255. Значение константы 0xFF будет принято как целое число со знаком,и для сравнения значение байта 0xFF будет также преобразовано в целое число со значением -1.

Вам необходимо набрать приведение литерала 0xFF, чтобы он был байтом.Измените утверждение на Assert.assertEquals((byte)0xFF, word.getByte(1));. Тогда левая часть будет иметь значение -1, а правая -

.
2 голосов
/ 22 июня 2011

Комментарий от biziclop правильный.Любое целое число , указанное вами в коде, считается целым числом, если не указано иное.

Измените ваше утверждение на:

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

И оно должно пройти нормально - какПервые два байта integer будут рассматриваться как byte.

Битверинг - в основном, когда вы пишете 0xFF, компилятор интерпретирует его как 0x000000FF, то есть 255.Вы хотите 0xFFFFFFFF, то есть -1.

Приведение к байту является правильным решением здесь

1 голос
/ 22 июня 2011

В 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
...