ビットごとの補数演算子は、bool オペランドに対して予期しないことを行います。以下のプログラムは、この出力を生成します。
x: 123456fe ~x: 87654301 !x: 556677ff
x: 123456ff ~x: 87654301 !x: 556677fe
X の任意のバイト値について、~X は常にバイト全体を 01 で上書きするようです。ただし、!X はバイトの LSB のみを補完するようです...
boolがintに変換され、ビットごとの補数が適用され、結果がboolに変換される場合、これは理にかなっていると思います。 しかし、なぜ1つの結果がメモリに8ビットを書き込み、もう1つの結果が1ビットしか書き込むのかわかりません。
#include "stdio.h"
typedef union {
bool b;
unsigned int i;
} ib_T;
int main(int argc, char **argv) {
ib_T x, y, z;
x.i = 0x123456fe;
y.i = 0x876543ff;
z.i = 0x55667777;
y.b = ~x.b;
z.b = !x.b;
printf("x: %08x ~x: %08x !x: %08x\n", x.i, y.i, z.i);
x.i = 0x123456ff;
y.b = ~x.b;
z.b = !x.b;
printf("x: %08x ~x: %08x !x: %08x\n", x.i, y.i, z.i);
}