2010-06-28 13 views

risposta

9

Non so cosa intendi a destra ea sinistra (endianness?) Ma C garantisce che a conterrà gli 8 bit di ordine inferiore (meno significativi) di . Cioè, l'incarico sarà logicamente equivalente a:

a = b % ((uint32_t)UINT8_MAX + 1); 
15

Sì. Effettuare una tale:

uint32_t num32 = 0xdeadbeef; 

uint8_t a = num32;  /* 0xef */ 
uint8_t b = num32 >> 8; /* 0xbe */ 
uint8_t c = num32 >> 16; /* 0xad */ 
uint8_t d = num32 >> 24; /* 0xde */ 

O questo:

union u 
{ 
    uint32_t num32; 

    struct 
    { 
     uint8_t a; 
     uint8_t b; 
     uint8_t c; 
     uint8_t d; 

    } bytes; 

} converter; 

converter.num32 = 0xdeadbeef; 

Il primo esempio non non dipendono piattaforma endianess, la seconda fa.

+0

Mentre il primo metodo dovrebbe funzionare su tutti i compilatori e piattaforme, il secondo metodo è limitato alla piattaforma in formato little endian. – Tom

+7

Sì, è quello che ho detto nella risposta, no? –

0

Si potrebbe guardare il union declaration. Se è possibile garantire che il processore/la fonte dei dati non cambieranno, si può presumere che sia 'endianness'

5

Dallo standard C, è garantito che a == b % (max_of_uint8_t + 1), ovvero gli 8 bit meno significativi. In § 6.3.1.3 (firmata e interi senza segno):

  1. Quando un valore di tipo intero viene convertito in un altro tipo intero diverso da _Bool, se il valore può essere rappresentato dal nuovo tipo, è invariato .
  2. In caso contrario, se il nuovo tipo non è firmato, , il valore viene convertito aggiungendo o sottraendo ripetutamente un valore superiore al valore massimo che può essere rappresentato nel nuovo tipo finché il valore non si trova nell'intervallo del nuovo tipo.

Usa a = b & 0xff se avete bisogno di essere al sicuro.

Problemi correlati