Почему оператор 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 ответа:
Потому что так говорит спецификация языка. Это не дает никаких оснований, но я подозреваю, что это наиболее вероятные намерения:
- иметь небольшой и простой набор правил для покрытия арифметических операций, включающих все возможные комбинации типов
- чтобы обеспечить эффективную реализацию - 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