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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top