按位补码运算符为bool操作数做了意想不到的事情.下面的程序产生这个输出:
x: 123456fe ~x: 87654301 !x: 556677ff
x: 123456ff ~x: 87654301 !x: 556677fe
Run Code Online (Sandbox Code Playgroud)
对于X中的任何字节值,~X似乎总是用01覆盖整个字节.但是,X似乎只补充字节的LSB ...
我想这是有道理的,如果将bool转换为int,应用了按位补码,并将结果转换回bool. 但是,我不明白为什么一个结果会将8位写入内存而另一个只写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);
}
Run Code Online (Sandbox Code Playgroud)
从您之前未分配的联合成员中读取未定义的行为.
在并集中,至多一个非静态数据成员可以在任何时间处于活动状态,也就是说,任何时候最多一个非静态数据成员的值都可以存储在并集中.
当类型共享公共布局时,此规则有一个例外,这在您的情况下不适用.通常,如果您指定x.i,则只能从中读取x.i; 如果你想开始阅读x.b,你需要先分配x.b.
我想这是有道理的,如果将bool转换为int,应用了按位补码,并将结果转换回bool.
这是100%正确:下面的代码段
bool b;
b = false;
printf("b: %d\n", b);
b = ~b;
printf("~b: %d\n", b);
b = ~b;
printf("~~b: %d\n", b);
Run Code Online (Sandbox Code Playgroud)
版画
b: 0
~b: 1
~~b: 1
Run Code Online (Sandbox Code Playgroud)
bool被提升为int,~应用了波浪号,然后bool使用通常的"零/非零"规则将结果转换回.
| 归档时间: |
|
| 查看次数: |
412 次 |
| 最近记录: |