Domanda

Su spostamento a sinistra di (char) 0xFF per 8 e il cast a int otteniamo -256 o 0xffffff00. Qualcuno può spiegare perché questo dovrebbe succedere?

#include <stdio.h>
int main (void)
{   
    char c = 0xff;
    printf("%d %x\n", (int)(c<<8),(int)(c<<8));
    return 0;
}

L'uscita è

-256 ffffff00
È stato utile?

Soluzione

char può essere firmato o non firmato - è definito dall'implementazione. Vedete questi risultati, perché char è firmato da default sul compilatore.

Per il sottoscritto char 0xFF corrisponde a -1 (è così che il lavoro complemento a due). Quando si tenta di spostarlo viene prima promosso a un int e poi spostato -. Si ottiene in modo efficace la moltiplicazione per 256

Così è questo codice:

char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );

Altri suggerimenti

Quando ho guardato il problema, la mia opinione iniziale era che il carattere 'c' deve essere spostata a sinistra di 8 bit -. Tutti gli 8 bit di essere scartato, il char vuoto sarebbe poi gettato in un int valore 0

Un po 'di ricerca rivela soliti Conversioni unarie - questo è dove per ridurre il gran numero di tipi aritmetici, le conversioni vengono applicate automaticamente operandi del unario, '!' '-', '~ 'e '*' operatori, e per ciascuna delle operandi del binario '<<' e '>>' operatori.

Quindi il carattere 'c' viene convertito in un int prima , poi spostata a sinistra, dando la risposta che si vede.

Si impara qualcosa di nuovo ogni giorno!

c viene promosso a un int prima che l'operazione di spostamento è fatto. Supponendo che l'implementazione rende caratteri firmati per impostazione predefinita, questo significa che si sta andando ad ottenere 0xffffffff, che viene poi spostata a sinistra per dare il risultato.

Se si effettua c in un unsigned char, si dovrebbe ottenere ciò che vi aspettate.

char non è altro che char firmato. Così char c = 0xFF saranno -1. Quando sei partito spostamento -1 da 8 bit si ottiene -256.

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