2014-11-22 14 views
6

Sono nuovo, quindi inizierò dicendo che mentre guardavo un po 'di codice mi sono reso conto che questa funzione non ha alcun senso per me.Conversione di char unsigned in int e short

Come si può notare, questa funzione specifica utilizza operatori bit a bit per convertire 4 elementi char senza segno in intero.

// Converte un array di quattro caratteri in un numero intero, tramite il modulo little endian

int toInt(const char* bytes) { 
    return (int)(((unsigned char)bytes[3] << 24) | 
       ((unsigned char)bytes[2] << 16) | 
       ((unsigned char)bytes[1] << 8) | 
       (unsigned char)bytes[0]); 
} 

short toShort(const char* bytes) { 
    return (short)(((unsigned char)bytes[1] << 8) | 
        (unsigned char)bytes[0]); 
} 

so già come operatori bit a bit e come char utilizza 1 byte e int utilizza 4 byte. Perché spostare i bit del char a 24 bit a sinistra e non solo convertirlo in modo esplicito in int convertirlo in un int? Perché sono necessari operatori bit a bit per questa funzione?

Questa funzione va oltre la mia comprensione, spiegare questo codice e come funziona o almeno darmi un collegamento che lo spieghi in modo approfondito.

Ho cercato ovunque la spiegazione ma non ho trovato.

Questo probabilmente ha una spiegazione abbastanza semplice.

+0

Uso operatore << su un tipo di lunghezza inferiore int promuove automaticamente l'input per un int. Il cast finale int non è necessario. –

risposta

6

Perché sono necessari operatori bit a bit per questa funzione?

Gli operatori bit a bit sono utilizzati per "assemblare" il numero di quattro byte da quattro numeri a byte singolo.

Diciamo che hai quattro numeri a 8 bit, in questo modo:

aaaaaaaa 
bbbbbbbb 
cccccccc 
dddddddd 

turni offrono questo:

aaaaaaaa000000000000000000000000 
00000000bbbbbbbb0000000000000000 
0000000000000000cccccccc00000000 
000000000000000000000000dddddddd 

Bitwise operatore OR consente di effettuare un unico numero da questi quattro parti, perché OR -ing qualsiasi bit x con uno zero produce x. Se si allinea numeri a quattro byte come mostrato sopra, v'è un solo bit non zero in ogni posizione, così bitwise OR s produrre il risultato desiderato:

aaaaaaaabbbbbbbbccccccccdddddddd 
+0

Ho cercato di riassumere questa risposta in un commento, ma non ho potuto. Bella risposta. –

+1

in questo caso come fanno i caratteri non firmati a spostare 24, 16, 8 bit per ottenere numeri interi? Questo non ha alcun senso. – Snake

+0

@Snake: giusta domanda. Leggi "Conversioni" in http://en.cppreference.com/w/cpp/language/operator_arithmetic: "prima di ogni altra azione (ma dopo la conversione da lvalue a rvalue, se applicabile), l'operando subisce una promozione integrale." – usr2564301

Problemi correlati