Слуш, я тебе честно признаюсь, я процентов на 50 понимаю только, что происходит. Но вот пример:
- Код: Выделить всё • Развернуть
void main(void)
{
signed int si = -2000;
signed char left_byte;
left_byte = si >> 8;
signed char right_byte;
right_byte = si;
si = (left_byte << 8)+right_byte;
printf("%i", si);
}
Можешь протестировать его тут:
http://codepad.org/bJOUoy8SОн работает на этом компиляторе. Не факт, чтобудет работать на другом. Подстава в том, что не всегда очевидно как компилятор делает преобразования signed ->unsigned. Некоторые делают это прозрачно, т.е. автоматически конвертят значения. Некоторые этим не озадачиваются. Я, честно, говоря, немног удивлен, что пример работает. Потому что при честном сплите 2's complement (т.е. если написать на листочке бинарное число и просто провести посередине черту) это не должно получиться. Но получается, т.е. там какая-то магия происходит в бэкграунде. Но это всегда легко протестировать. Главное, используй сдвиг, а не суммирование/вычитание/деление (отличный совет, который полностью херит твою программу, если ты компиляешь каким-нить 32-битном эмбеддед компилером - он старшие 8 бит просто откажется двигать и трындец).
Короче пробуй. Не надо ничего ни во что конвертировать. Тупо сдвигай и режь пополам.