Подтвердить что ты не робот

Почему оператор 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? Я знаю, что могу просто вернуть его обратно в байт, но это кажется глупым.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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