Почему оператор xor на двух байтах производит int?


        //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 29

4 ответа:

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

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

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

byte a = (byte) 0xDE; 
byte b = (byte) 0xAD;
byte r = (byte) ( a ^ b);

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

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

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

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