Почему оператор xor на двух байтах выдает int? - PullRequest
29 голосов
/ 05 января 2010
        //key & hash are both byte[]
        int leftPos = 0, rightPos = 31;
        while(leftPos < 16) {
            //possible loss of precision. required: byte, found: int
            key[leftPos] = hash[leftPos] ^ hash[rightPos];
            leftPos++;
            rightPos--;
        }

Почему побитовая операция над двумя байтами в Java возвращает int? Я знаю, что мог бы просто привести его обратно к байту, но это кажется глупым.

Ответы [ 4 ]

20 голосов
/ 05 января 2010

Потому что так сказано в спецификации языка. Это не дает никаких оснований, но я подозреваю, что это наиболее вероятные намерения:

  • Иметь небольшой и простой набор правил для арифметических операций, включающих все возможные комбинации типов
  • Чтобы обеспечить эффективную реализацию - 32-разрядные целые числа - это то, что ЦП используют для внутреннего использования, а все остальное требует преобразования, явного или неявного.
5 голосов
/ 10 февраля 2010

Если это правильно и не существует значения, которое может вызвать эту потерю точности, другими словами: «невозможная потеря точности», то компилятор должен замолчать ... и его необходимо исправить, и не нужно добавлять приведение это:

byte a = (byte) 0xDE; 
byte b = (byte) 0xAD;
byte r = (byte) ( a ^ b);
2 голосов
/ 05 января 2010

Нет битовых операций Java на двух байтах. Ваш код неявно и бесшумно преобразует эти байты в больший целочисленный тип (int), и результат также имеет этот тип.

Теперь вы можете поставить под сомнение разумность оставления битовых операций над байтами неопределенными.

0 голосов
/ 05 января 2010

Это было где-то внизу в ответах на один из похожих вопросов, которые люди уже указывали:

http://blogs.msdn.com/oldnewthing/archive/2004/03/10/87247.aspx

...