Что можно предположить о представлении истины? - PullRequest
0 голосов
/ 30 декабря 2018

Эта программа возвращает 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?

1 Ответ

0 голосов
/ 30 декабря 2018

Сноска 122 в стандарте C11 гласит:

Хотя число битов в объекте _Bool не меньше CHAR_BIT, ширина (количество битов знака и значения) _Bool может быть просто1 бит.

Таким образом, в компиляторе, в котором _Bool имеет только один бит значения, только один из битов char будет действовать, когда вы читаете его из памяти как _Bool,Другие биты являются битами заполнения, которые игнорируются.

Когда я проверяю ваш код с помощью GCC, член _Bool получает значение 1 при назначении нечетного номера для u.c и 0 при назначении четного числа, предполагая, что он смотрит только на младший бит.

Обратите внимание, что вышеприведенное верно только для определения типа.Если вместо этого вы преобразуете (неявное или явное приведение) char в _Bool, значение будет равно 1, если char отличен от нуля.

...