This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Problem Splitting Integer Variable

hi everyone...

i am facing a problem in my college project...

i have a 16bit unsigned integer variable and i need to store it in the 24C02 EEPROM, but that saves 8bit variable at a time...

the number i need to save is in the form of a decimal integer, how do i split it into 2 unsigned char variables..

i am using the following method

unsigned int val;
unsigned char a,b;

a= (val & 0xFF00)>>8;
b=(val * 0x00FF);


is this code right?

and when i read it back i read it like this

unsigned int val;
val= (((a & 0x00FF)<<8) | (b & 0x00FF));

is this code right?
or is there any other way?

note: i obtain val initially from the user input by using this routine

unsigned int Temp2=0;
Temp2*=10;
Temp2+=Keypress-'0';

Keypress is the input obtained from the keyboard which is ASCII and in the range '0' to '9' and Temp2 is stored in the EEPROM using the Routine i tried


Error:

i tried saving 1234 and when i read it back i got 1024
6666 was read back as 6656
5555 was read back as 5376
1600 was read back as 1536

Parents
  • With debugging, you would be able to take the value 0x1234 and split and see yourself if you get 0x12 in one byte and 0x34 in another byte.

    Then you would know if you have an issue splitting, or if you have an issue merging.

    I'm not joking when I say you have to figure out how to verify issues yourself. First when you do know something doesn't work and can't figure out why is it meaningful to ask on a forum. But your progress will be much higher if you do try to verify statements yourself.

    Integer promotion is that a 8-bit char is converted to "int" first, before performing arithmetic on it. This is a requirement in the C language. Cheap to do for a 16-bit or 32-bit processor, but costly for an 8-bit processor where "int" is larger than any register.

    So Keil have optioned to generate non-standard code with C51 depending on compiler flags. This means that when you do a shift with your 8-bit char, you shift out real bits into air. You not to explicitly typecast to (unsigned int) before you do the shift, so you have room to store your 8 "high" bits after the shift.

Reply
  • With debugging, you would be able to take the value 0x1234 and split and see yourself if you get 0x12 in one byte and 0x34 in another byte.

    Then you would know if you have an issue splitting, or if you have an issue merging.

    I'm not joking when I say you have to figure out how to verify issues yourself. First when you do know something doesn't work and can't figure out why is it meaningful to ask on a forum. But your progress will be much higher if you do try to verify statements yourself.

    Integer promotion is that a 8-bit char is converted to "int" first, before performing arithmetic on it. This is a requirement in the C language. Cheap to do for a 16-bit or 32-bit processor, but costly for an 8-bit processor where "int" is larger than any register.

    So Keil have optioned to generate non-standard code with C51 depending on compiler flags. This means that when you do a shift with your 8-bit char, you shift out real bits into air. You not to explicitly typecast to (unsigned int) before you do the shift, so you have room to store your 8 "high" bits after the shift.

Children
No data