tipo di byte firmato e operatori bit a bit in Java?
Citando da oracle website "byte: il tipo di dati byte è un numero intero di complemento a due con segno a 8 bit. Ha un valore minimo di -128 e un valore massimo di 127 (incluso)".
Qui, le prime due righe sono valide ma l'ultima non è
byte b = -128;
byte b1 = 127;
byte b2 = b>>>b1;//illegal
Q1) che cosa si intende esattamente per 8-bit firmato? 128 in formato binario sarebbe 1000 0000 e -128 avrebbe bisogno di un bit in più per il segno negativo, dove si adatterebbe se tutti gli 8 bit fossero occupati.
Q2) per int, c'è un operatore di spostamento a destra non firmato, ma sembra illegale con i byte, perché è così. non è possibile impedire l'overflow in caso di byte. In caso di int, funziona
Grazie per il vostro aiuto
1 answers
Proprio come sembra: ci sono 8 bit, che contengono 2^8 = 256 valori possibili. È firmato, quindi l'intervallo è frmo da -128 a 127 (256 valori). Il bit più significativo ha un valore di -128.
In Java, la promozione numerica binaria si verifica con operazioni come
b >>> b1
. Entrambi i tipi sono promossi aint
e il risultato è unint
. Tuttavia, è possibile eseguire il cast esplicito del risultato abyte
.
Ecco il cast:
byte b2 = (byte) (b >>> b1);
Il JLS, Sezione 5.6.2, parla della promozione numerica binaria:
Ampliamento conversione primitiva (§5.1.2) viene applicato per convertire uno o entrambi gli operandi come specificato dalle seguenti regole:
Se uno degli operando è di tipo double, l'altro viene convertito in double.
Altrimenti, se uno degli operando è di tipo float, l'altro viene convertito float.
Altrimenti, se uno degli operando è di tipo long, l'altro viene convertito lungo.
In caso contrario, entrambi gli operandi vengono convertiti in tipo int.
(enfasi mia)