kazak1102
В AVR похоже Little Endian ( 0x1234 ).
Есть два порядка байт. В Intel x86 используется LE ( A0, A1, ..., An). 0x1234, старший байт 34, младший 12). Проблема в совместимости. На платформе, где используется BE, попытка выполнить код:
int a = 0x1234;
приведёт к тому, что по факту в a будет не 0x1234, а 0x3412.
Я могу сказать, что я до сих пор путаюсь и "endianness" определяю методом тыка.
Подробнее тут:
https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2
Суть в чём. Тебе нужно знать порядок байт, чтобы корректно загнать байты в многобайтную переменную. Идея такова.
Пусть у тебя есть
char reg_l = 0x34;
хранящий младшие разряды, и
char reg_h = 0x12;
хранящий старшие. Тогда получить в одной многобайтной переменной значение можно так:
short reg = reg_h<<8 + reg_l;
Если порядок байт другой, то будет соответственно
short reg = reg_l << 8 + reg_h;
Понять "сдвиг" очень легко. Возьми калькулятор (виндовый подойдёт), переведи в режим систем счисления, а дальше напиши какое-нибудь число, например 255 (для простоты). Переведи в двоичную, будет 1111 1111. Дальше сдвиг влево на 1 разряд - ты берёшь эту всю фигню и двигаешь влево, дописывая 0 справа. Будет 1111 1111 0. По сути сдвиг влево на 1 разряд = умножить на 2. Со сдвигом вправо такая же ботва, только ты "теряешь" правые разряды. Соответственно это поделить на 2.
А теперь по сути у тебя получится, что ты имеешь старший разряд (пусть 255) и младший (пусть 127 = 0111 1111 ). Берём старший разряд и двигаем влево на 8 разрядов. У нас получится переменная типа short (2 байта) со значением 1111 1111 0000 0000. Прибавим к ней младший разряд. Будет 1111 1111 1000 0000.
Тока я с порядком напутал всё же...
короче это лучше экспериментально проверять