Эта программа возвращает 0
на моем компьютере:
#include <stdbool.h>
union U {
_Bool b;
char c;
};
int main(void) {
union U u;
u.c = 3;
_Bool b = u.b;
if (b == true) {
return 0;
} else {
return 1;
}
}
AFAICT, _Bool
- это целочисленный тип, который может по крайней мере хранить 0
и 1
, а true
- этоинтегральная постоянная 1
.На моей машине _Bool
имеет sizeof(_Bool) == 1
и CHAR_BITS == 8
, что означает, что _Bool
имеет 256 представлений.
Я не могу найти много в стандарте C о представлениях ловушек _Bool
, и я не могу найти, создаю ли _Bool
с представлением, отличным от 0
или 1
(для реализаций, которые поддерживают более двух представлений) - это нормально, и если это нормально, обозначают ли эти представления истину или ложь.
То, что я могу найти в стандарте, это то, что происходит, когда сравнивается _Bool
сцелое число, целое число преобразуется в представление 0
, если оно имеет значение 0
, и в представление 1
, если оно имеет значение, отличное от нуля, так что приведенный выше фрагмент заканчивает сравнение двух _Bool
s.с разными представлениями: _Bool[3] == _Bool[1]
.
Я не могу найти много в стандарте C о том, каков результат такого сравнения.Поскольку _Bool
является целочисленным типом, я ожидал бы, что правила для целых чисел будут применяться, так что сравнение на равенство возвращает true, только если представления равны, что здесь не так.
Поскольку на моей платформе эта программа возвращает 0
, может показаться, что это правило здесь не применяется.
Почему этот код ведет себя так?(то есть что я пропускаю? Какие представления _Bool
являются представлениями ловушек, а какие нет? Сколько представлений может представлять true
и false
? Какую роль в этом играют биты заполнения? и т. д.)
Что могут предположить переносимые программы на Си о представлении _Bool
?