Цитата(defunct @ Dec 28 2007, 18:15)

Логика почти правильная, за исключением "просто устанавливает старший бит". На самом деле делается честное преобразование 100 0x64 в (-100) 0x9C, но т.к. это unsigned char, то 0x9C трактуется как положительное число 156. 20 < 156 ? - да.
согласен, вчера был тяжелый день

Цитата(WHALE @ Dec 29 2007, 09:25)

Выбрось каку!!! Обьясните тупому,плиз.
eeprom unsigned char edata[20][8]={{90,0,...},{}...};
unsigned int a;
Запись a=edata[0][0]+edata[0][1]<<8; эквивалентна a= (edata[0][0]+edata[0][1] ) << 8;
Т.е вначале складываются 2 unsigned char и с какого перепуга компилятор должен их автоматически приводить к int?А вот сдвиг результата влево да,уже дожен.Тока ошибка уже гарантирована.
Имхо,есичё.

согласно стандарту integer promotion эта операция должна производиться всегда (во избежание overflow), а потом уже результат усекаться до размера целевой переменной. представьте себе
Код
unsigned char c1 = 250, c2 = 250;
int a = c1 + c2;
если не выполнить promotion ДО вычисления суммы, ошибка, как Вы говорите, гарантирована
Сообщение отредактировал sergik_vrn - Dec 29 2007, 06:57