Convertir el entero al carácter

3

Estoy usando el microcontrolador PIC18f. Tengo que escribir variables enteras de 16 bits (2 bytes) que se convirtieron en dos variables de caracteres, es decir, para escribir cada byte en una dirección de EEPROM consecutiva. Al principio, tengo que escribir un byte superior (datos de 8 bits) en la EEPROM. No puedo obtener los 8 bits más altos de la variable entera mediante el siguiente código (donde puedo escribir los ocho bits más bajos de la variable entera). Mi código es

void int_EEPROM_putc(unsigned char address, unsigned char data);
unsigned char int_EEPROM_getc(unsigned char address);
unsigned char c;
unsigned int d;
unsigned char* e;
unsigned char f;

void main()
{
d=0xffff;
e=(unsigned char*)&d;
//f=*e
f=*(e+1);
int_EEPROM_putc(0x02,f); 
delay_ms(100);
c=int_EEPROM_getc(0x02); 
while(true)
{
    if(c==255)
    {
    PORTB=~PORTB;
    }
    else
    {
    PORTB=0xff;
    }
}
    
pregunta KATHIR kamu

2 respuestas

3

El enfoque más general para extraer piezas de un valor entero es desplazar y enmascarar. Entonces:

d = whatever;
c = d & 0xff; // extract low 8 bits
c = (d >> 8) & 0xff; // extract next 8 bits

Si, como aquí, sabe que el valor en d es de 16 bits, puede simplificar un poco el código para los siguientes 8 bits escribiendo

c = d >> 8; // extract high 8 bits of 16-bit value
    
respondido por el Pete Becker
0

En general ... no es una práctica excelente asumir cualquier tamaño de bit o "endiancia" por cualquier int, por razones de portabilidad. Dependiendo del procesador y el compilador, e int puede ser cualquier cosa de 8 bits a 64 bits, o incluso algún otro tamaño impar, y puede almacenarse en formato little-endian o big-endian.

¿Qué sucede si haces cualquiera de estos dos?

if(d==255)
{
}

// or 

int d = 0xffff;
d >> 8;
char c = d;
if (c==255)
{
}
    
respondido por el TDHofstetter

Lea otras preguntas en las etiquetas