Столкнулся со странным поведением при больших сдвигах, например:
Код
void rs232_tx_uchar( unsigned char);
Код
void rs232_tx_ulong( unsigned long txData)
{
rs232_tx_uchar( txData >> 24);
rs232_tx_uchar( txData >> 16);
rs232_tx_uchar( txData >> 8);
rs232_tx_uchar( txData);
}
{
rs232_tx_uchar( txData >> 24);
rs232_tx_uchar( txData >> 16);
rs232_tx_uchar( txData >> 8);
rs232_tx_uchar( txData);
}
При запуске старший байт старшего слова на терминал не выводится, вместо него дважды
выводится младший байт старшего слова - 'сдвиг' на 24 не работает.
Если сделать так
Код
void rs232_tx_ulong( unsigned long txData)
{
unsigned int tmpData = txData >> 16;
rs232_tx_uchar( tmpData >> 8);
rs232_tx_uchar( txData >> 16);
rs232_tx_uchar( txData >> 8);
rs232_tx_uchar( txData);
}
{
unsigned int tmpData = txData >> 16;
rs232_tx_uchar( tmpData >> 8);
rs232_tx_uchar( txData >> 16);
rs232_tx_uchar( txData >> 8);
rs232_tx_uchar( txData);
}
то все работает нормально.
Та же проблема и в более серьезных местах.
Кто-нибудь сталкивался или это я чего-то не понимаю ?
PS Да, оптимизация -O2.