2012-06-30 8 views
7

Si consideri il seguente codice:Che cosa dice lo standard C sul bit-shifting di più bit rispetto alla larghezza del tipo?

int i = 3 << 65; 

mi aspetterei che il risultato è i==0, tuttavia il risultato effettivo è i==6. Con alcuni test ho scoperto che con il seguente codice:

int i, s; 
int a = i << s; 
int b = i << (s & 31); 

i valori di a e b sono sempre gli stessi.

Lo standard C dice qualcosa sullo spostamento di oltre 32 bit (la larghezza del tipo int) o è un comportamento non specificato?

risposta

12

Dal mio progetto WG12/N1124 (non lo standard, ma abbastanza buono per me), c'è il seguente blocco in 6.5.7 bit a bit operatori di spostamento:

Se il valore del diritto l'operando è negativo o è maggiore o uguale alla larghezza dell'operando sinistro promosso, il comportamento non è definito.

Quindi, undefined. Stai attento.

+0

"Good Enough For Me" - abbastanza buono per tutti, poiché lo standard contiene esattamente la stessa lingua. :-) Nota che puoi anche ottenere C99 + TC3 gratuitamente su http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf e anch'esso ha la stessa lingua, quindi anche se non hai lo stesso standard puoi essere abbastanza sicuro di quello che dice! –

+3

Puoi anche ottenere una versione html molto più facile da leggere qui: http://port70.net/~nsz/c/c99/n1256.html –

+0

@R .., oh, grazie, sarà molto più facile leggere rispetto al PDF. :) – sarnold

Problemi correlati