|

|

Программизма псот
Обнаружил забавный баг.
unsigned int m; unsigned int m_old;
void main( void) { // Test values m = 6; m_old = 5; if ( ( (m - m_old) >= 20) || ( (m_old - m) >= 20)) { LED = 1; }
По задумке в коде проверяется отклонение значения некоторого параметра ( m) от его предыдущего значения ( m_old). Т.е. берем модуль разности и сравниваем с некоторым порогом ( 20). Если модуль больше порога - выполняем некоторые действия. В примере ниже - зажигаем светодиод. А баг собственно в том, что 100 - 101 = -1. Т.е. 0xFFFF. Т.е. в данном варианте одно из условий всегда выполняется... А теперь о том как это решается приведением типов:
signed int i, j, a, b; unsigned int k, l; char bool1, bool2, bool3, bool4, bool5, bool6;
unsigned int m; unsigned int m_old;
void main( void) { // Test values m = 6; m_old = 5; if ( ( ( signed int)(m - m_old) >= 20) || ( ( signed int)(m_old - m) >= 20)) { LED = 1; }
i = m - m_old; j = m_old - m; k = ( unsigned int) m - m_old; l = ( unsigned int) m_old - m; a = ( signed int) m - m_old; b = ( signed int) m_old - m;
bool1 = ( (m - m_old) >= 20); bool2 = ( (m_old - m) >= 20); bool3 = ( ( unsigned int) (m - m_old) >= 20); bool4 = ( ( unsigned int) (m_old - m) >= 20); bool5 = ( ( signed int) (m - m_old) >= 20); bool6 = ( ( signed int) (m_old - m) >= 20);
И watch table
Address Symbol Name Value Hex Decimal Binary Char
080 i 0x0001 0x0001 1 00000000 00000001 '..' 082 j 0xFFFF 0xFFFF -1 11111111 11111111 '..' 088 k 0x0001 0x0001 1 00000000 00000001 '..' 08A l 0xFFFF 0xFFFF 65535 11111111 11111111 '..' 084 a 0x0001 0x0001 1 00000000 00000001 '..' 086 b 0xFFFF 0xFFFF -1 11111111 11111111 '..' 08C bool1 0x00 0x00 0 00000000 '.' 08D bool2 0x01 0x01 1 00000001 '.' 08E bool3 0x00 0x00 0 00000000 '.' 08F bool4 0x01 0x01 1 00000001 '.' 090 bool5 0x00 0x00 0 00000000 '.' 091 bool6 0x00 0x00 0 00000000 '.'
|
|