Цитата(Dx! @ Sep 28 2010, 20:15)

Компилятор WinAVR-20090313
Неужели ((~PIND) >> 4) и (~(PIND >> 4)) должны давать одинаковый результат?
PIND у меня равен 0b1110????
~(PIND >> 4) получается 0b11110001 как и должно быть.
(~PIND) >> 4 получается тоже 0b11110001, хотя мне кажется должно быть 0b00000001
Я ошибаюсь?
Разбираем по шагам:
PIND = 0b1110**** (PIND это 8 битное число)
результат инвертирования (почему смотри ниже) будет иметь тип int (в avr-gcc тип int это знаковое 16 битное число). поэтому 8 битное беззнаковое число будет расширено до знакового 16 битного
~PIND == ~(0b00000000 1110****) == 0b11111111 0001***
(~PIND) >> 4 с правой стороны этого выражения числовая константа (без явного указания типа), а по стандарту си она должна интерпретироваться как тип
int. При операции сдвига меньший операнд по стандарту си должен быть расширен до бОльшего (именно по этой причине компилятор делал инвертирование в 16 битах). т.е. имеем: (~PIND) >> 4 == 0b11111111 0001**** >> 4 == 0b11111111 11110001
итого, если результат приводится к 8ми битному типу то должно получиться 0b11110001.
Если это не так, то надо более точно разбираться.