Почему делает оператор XOR на двухбайтовом продукте интервал?

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

29
задан RzR 19 January 2014 в 17:48
поделиться

4 ответа

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

  • Иметь небольшой и простой набор правил, охватывающий арифметические операции, включающие все возможные комбинации типов
  • Обеспечивать эффективную реализацию - 32-битные целые числа это то, что процессоры используют внутри, а все остальное требует явных или неявных преобразований.
20
ответ дан 28 November 2019 в 02:03
поделиться

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

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

.
2
ответ дан 28 November 2019 в 02:03
поделиться

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

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

0
ответ дан 28 November 2019 в 02:03
поделиться

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

byte a = (byte) 0xDE; 
byte b = (byte) 0xAD;
byte r = (byte) ( a ^ b);
5
ответ дан 28 November 2019 в 02:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: