Я такие вещи энумераторами делаю, типа: typedef enum {
DInFailure = 0,
DInLow,
DInHigh
} DigitalInputState_t;
И потом со всеми состояниями работаю исключительно через нумератор. Компилятору несложно нулевое значение нумератора - ошибка. Если не нулевое, значит, ОК, а состояние - во втором бите. Ну и не забыть птичку у компилятора поставить, чтобы разрешить вместо стандартного целого значения, использовать минимально-достаточный размер переменных.