Цитата(sergeeff @ Jul 22 2009, 20:15)

Судя по тому, что вы подключаете в проект файл stdbool.h - тип bool не встроен в компилятор, а реализован через некоторое переопределение
Если компилятор соответствует стандарту С99, то он должен иметь
- встроенный тип _Bool с рангом ниже любого целочисленного типа, способный вместить 0 и 1, при приведении любого скалярного значения к _Bool оно приводится как (val == 0 ? 0 : 1)
- стандартный включаемый файл stdbool.h, который определяет
#define bool _Bool
#define true 1
#define false 0
Так что если обсуждаемая ситуация касается С99-режима компиляции и bool не переопределён пользователем, то после
Код
bool b;
b = 13;
в b будет корректное значение, ну а
Код
*(unsigned char *)&b = 13;
как уже говорилось - неконтролируемая компилятором порнография, приводящая к UB.
И при
Код
bool b, b1;
*(unsigned char *)&b = 13;
b1 = b;
// и даже
b1 = (bool)b;
компилятор не обязан ничего проверять и "переприводить" - он не виноват, что в b левыми путями натолкали мусор.
Частными случаями UB может быть и ожидаемое программистом поведение, и совершенно противоположное.
Код
b1 = (bool)(int)b;
должно бы работать правильно, но не лучше ли обойтись без извращений?