Operatori di spostamento bit per bitBitwise Shift Operators

Gli operatori shift spostano il primo operando sinistro (<<) o destro (>>) in base al numero di posizioni che il secondo operando specifica.The shift operators shift their first operand left (<<) or right (>>) by the number of positions the second operand specifies.

SintassiSyntax

shift-expression:shift-expression:
additive-expressionadditive-expression

shift-expression << additive-expression shift-expression >> additive-expressionshift-expression << additive-expression shift-expression >> additive-expression

Entrambi gli operandi devono essere valori integrali.Both operands must be integral values. Questi operatori eseguono le consuete conversioni aritmetiche; il tipo del risultato è il tipo dell'operando sinistro dopo la conversione.These operators perform the usual arithmetic conversions; the type of the result is the type of the left operand after conversion.

Per spostamenti verso sinistra, i bit a destra sgomberati vengono impostati su 0.For leftward shifts, the vacated right bits are set to 0. Per spostamenti verso destra, i bit a sinistra sgomberati vengono riempiti in base al tipo del primo operando dopo la conversione.For rightward shifts, the vacated left bits are filled based on the type of the first operand after conversion. Se il tipo è unsigned, vengono impostati su 0.If the type is unsigned, they are set to 0. In caso contrario, vengono riempiti con copie del bit di segno.Otherwise, they are filled with copies of the sign bit. Per operatori left-shift senza overflow, l'istruzioneFor left-shift operators without overflow, the statement

expr1 << expr2   

equivale alla moltiplicazione per 2expr2.is equivalent to multiplication by 2expr2. Per operatori right-shiftFor right-shift operators,

expr1 >> expr2   

equivale alla divisione per 2expr2 se expr1 è senza segno o con un valore non negativo.is equivalent to division by 2expr2 if expr1 is unsigned or has a nonnegative value.

Il risultato di un'operazione di spostamento non è definito se il secondo operando è negativo o se l'operando destro è maggiore o uguale alla larghezza in bit dell'operando sinistro promosso.The result of a shift operation is undefined if the second operand is negative, or if the right operand is greater than or equal to the width in bits of the promoted left operand.

Poiché le conversioni eseguite dagli operatori shift non consentono condizioni di overflow o di underflow, le informazioni potrebbero essere perse se il risultato di un'operazione di spostamento non può essere rappresentato nel tipo del primo operando dopo la conversione.Since the conversions performed by the shift operators do not provide for overflow or underflow conditions, information may be lost if the result of a shift operation cannot be represented in the type of the first operand after conversion.

unsigned int x, y, z;  

x = 0x00AA;  
y = 0x5500;  

z = ( x << 8 ) + ( y >> 8 );  

In questo esempio, x è spostata otto posizioni a sinistra e y è spostata otto posizioni a destra.In this example, x is shifted left eight positions and y is shifted right eight positions. I valori spostati vengono aggiunti, fornendo 0xAA55 e assegnati a z.The shifted values are added, giving 0xAA55, and assigned to z.

Lo spostamento di un valore negativo a destra produce la metà del valore originale, arrotondata per difetto.Shifting a negative value to the right yields half the original value, rounded down. Ad esempio, -253 (in binario 11111111 00000011) con scorrimento aritmetico a destra di un bit produce -127 (in binario 11111111 10000001).For example, -253 (binary 11111111 00000011) shifted right one bit produces -127 (binary 11111111 10000001). Un valore positivo 253 ha uno spostamento verso destra per produrre +126.A positive 253 shifts right to produce +126.

Gli scorrimenti a destra mantengono il bit di segno.Right shifts preserve the sign bit. Quando un intero con segno scorre a destra, il bit più significativo rimane impostato.When a signed integer shifts right, the most-significant bit remains set. Quando un intero senza segno scorre a destra, il bit più significativo viene cancellato.When an unsigned integer shifts right, the most-significant bit is cleared.

Vedere ancheSee Also

Operatori Left Shift e Right Shift (>> e <<)Left Shift and Right Shift Operators (>> and <<)