Bitshift e promozione intero?
-
28-09-2019 - |
Domanda
normalmente, C richiede che gli operandi di un operatore binario sono promossi al tipo dell'operando rango superiore. Questo può essere sfruttato per evitare il codice riempimento con verbose calchi, per esempio:
if (x-48U<10) ...
y = x+0ULL << 40;
ecc.
Tuttavia, ho trovato che, almeno con gcc, questo comportamento non funziona per bitshifts. Cioè.
int x = 1;
unsigned long long y = x << 32ULL;
mi aspetto il tipo di destra, operando per provocare la mano sinistra operando per essere promosso a unsigned long long
in modo che il passaggio ha esito positivo. Ma invece, gcc stampa un avvertimento:
warning: left shift count >= width of type
È gcc rotto, o fa la norma fare qualche eccezione alle regole di promozione di tipo per bitshifts?
Soluzione
I cosiddetti usuali conversioni aritmetiche si applica a molti operatori binari, ma non tutti. Per esempio, essi non si applicano agli operatori di scorrimento di bit, &&, ||, operatori operatore virgola e di assegnazione. Questa è la regola per gli operatori di scorrimento di bit:
6.5.7 ... 3 Semantica ...
Le promozioni interi vengono eseguite su ogni operando. Il tipo del risultato è quello dell'operando sinistro promosso. Se il valore dell'operando destro è negativo o è maggiore o uguale alla larghezza dell'operando sinistro promosso, è definito il comportamento.
Altri suggerimenti
Il problema è davvero che la promozione funziona solo fino a qualunque sia il vostro definisce piattaforma come int
. Come alcune altre risposte hanno dichiarato, l'operatore bit-shift promuoverà l'operando di sinistra un int. Tuttavia, qui un int
è definito come un valore di 32 bit. La conversione intero non promuoverà un long long
(64 bit).