Очень важно квалифицировать ваши переменные как подписанные или неподписанные. Компилятор должен знать, как обрабатывать переменные во время сравнений и приведения. Проверьте вывод этого кода:
#include <stdio.h>
typedef struct
{
signed s : 1;
unsigned u : 1;
} BitStruct;
int main(void)
{
BitStruct x;
x.s = 1;
x.u = 1;
printf("s: %d \t u: %d\r\n", x.s, x.u);
printf("s>0: %d \t u>0: %d\r\n", x.s > 0, x.u > 0);
return 0;
}
Выход:
s: -1 u: 1
s>0: 0 u>0: 1
Компилятор сохраняет переменную, используя один бит, 1 или 0. Для знаковых переменных старший значащий бит определяет знак (старший считается отрицательным). Таким образом, переменная со знаком, хотя она хранится как 1 в двоичном виде, интерпретируется как отрицательная.
В этом разделе двухбитное число без знака имеет диапазон от 0 до 3, а двухбитное число со знаком имеет диапазон от -2 до 1.