Почему оператор 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? Я знаю, что могу просто вернуть его обратно в байт, но это кажется глупым.
Ответы
Ответ 1
Потому что язык говорит так. Это не дает никаких оснований, но я подозреваю, что это наиболее вероятные намерения:
- Чтобы иметь небольшой и простой набор правил для покрытия арифметических операций с участием всех возможных комбинаций типов
- Чтобы обеспечить эффективную реализацию - 32-битные целые числа - это то, что CPU используют внутри, а все остальное требует конверсий, явных или неявных.
Ответ 2
Если это правильно и нет значения, которое может привести к этой потере точности, другими словами: "невозможная потеря точности", компилятор должен заткнуться... и его нужно исправить, и никакое литье должно быть добавлено в это:
byte a = (byte) 0xDE;
byte b = (byte) 0xAD;
byte r = (byte) ( a ^ b);
Ответ 3
В двух байтах нет побитовых операций Java. Ваш код неявно и молча преобразует эти байты в более крупный целочисленный тип (int
), и результат этого типа также.
Теперь вы можете задать вопрос о разумности оставить побитовые операции в байтах undefined.
Ответ 4
Это было где-то в ответах на один из подобных вопросов, о которых люди уже указывали:
http://blogs.msdn.com/oldnewthing/archive/2004/03/10/87247.aspx