2010-06-28 32 views

Respuesta

9

No sé lo que quiere decir rightmost and leftmost (endianness?) Pero C garantiza que a contendrá los 8 bits de menor orden (menos significativos) de b. Es decir, la asignación será lógicamente equivalente a:

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

Sí. Hacer bien esto:

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 esto:

union u 
{ 
    uint32_t num32; 

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

    } bytes; 

} converter; 

converter.num32 = 0xdeadbeef; 

El primer ejemplo no no dependen de endianess plataforma, la segunda hace.

+0

Si bien su primer método debería funcionar en todos los compiladores y plataformas, el segundo método está limitado a la plataforma en formato little endian. – Tom

+7

Sí, eso es lo que dije en la respuesta, ¿no? –

5

A partir del estándar C, se garantiza que a == b % (max_of_uint8_t + 1), es decir, los 8 bits menos significativos. En § 6.3.1.3 (firmado y enteros sin signo):

  1. Cuando un valor con el tipo de número entero se convierte en otro tipo entero distinto de _Bool, si el valor puede ser representado por el nuevo tipo, es sin cambios .
  2. De lo contrario, si el nuevo tipo no está firmado, el valor se convierte al agregar o restar repetidamente uno más que el valor máximo que se puede representar en el nuevo tipo hasta que el valor esté en el rango del nuevo tipo.

Uso a = b & 0xff Si tiene que ser seguro.

Cuestiones relacionadas