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

Author: Community, 2013-10-17

1 answers

  1. 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.

  2. In Java, la promozione numerica binaria si verifica con operazioni come b >>> b1. Entrambi i tipi sono promossi a int e il risultato è un int. Tuttavia, è possibile eseguire il cast esplicito del risultato a byte.

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)

 5
Author: rgettman, 2013-10-17 18:27:41