¿Cómo convierto y divido un entero de 2 bytes en 2 caracteres diferentes en C?

Quiero convertir un int sin firmar y dividirlo en 2 caracteres. Por ejemplo: si el número entero es 1, su representación binaria sería 0000 0001. Quiero la parte 0000 en una variable char y la parte 0001 en otra variable binaria. ¿Cómo logro esto en C?

Si insistes en que tienes un sizeof(int)==2 entonces:

  unsigned int x = (unsigned int)2; //or any other value it happens to be unsigned char high = (unsigned char)(x>>8); unsigned char low = x & 0xff; 

Si tiene un total de ocho bits (un byte) y lo divide en dos valores de 4 bits:

  unsigned char x=2;// or whatever unsigned char high = (x>>4); unsigned char low = x & 0xf; 

Desplaza y enmascara la parte del número que quieras. Las entradas sin firmar son probablemente de cuatro bytes, y si quisiera los cuatro bytes, simplemente cambiaría entre 16 y 24 para los bytes de orden superior.

 unsigned char low = myuint & 0xff; unsigned char high = (myuint >> 8) & 0xff; 

¡¡¡Esto es asumiendo una comprobación de 16 bits con sizeof !! En mi plataforma, los ints son de 32 bits, por lo que usaré un corto en este ejemplo de código. El mío gana el premio para el más desagradable en términos de separar el puntero, pero también es lo más claro para mi entender.

 unsigned short number = 1; unsigned char a; a = *((unsigned char*)(&number)); // Grab char from first byte of the pointer to the int unsigned char b; b = *((unsigned char*)(&number) + 1); // Offset one byte from the pointer and grab second char 

Un método que funciona es el siguiente:

 typedef union { unsigned char c[sizeof(int)]; int i; } intchar__t; intchar__t x; xi = 2; 

Ahora xc [] (una matriz) hará referencia al número entero como una serie de caracteres, aunque tendrá problemas de bytes. Se pueden abordar con los valores #define apropiados para la plataforma en la que está progtwigndo. Esto es similar a la respuesta que brindó Justin Meiner, pero un poco más limpio.

 unsigned short s = 0xFFEE; unsigned char b1 = (s >> 8)&0xFF; unsigned char b2 = (((s << 8)>> 8) & 0xFF); 

Lo más simple que pude pensar.

 int i = 1 // 2 Byte integer value 0x0001 unsigned char byteLow = (i & 0x00FF); unsinged char byteHigh = ((i & 0xFF00) >> 8); 

el valor en byteLow es 0x01 y el valor en byteHigh es 0x00