~ 运算符为布尔而努力
~ operator acts strangly for bool
按位补码运算符对布尔操作数做了意想不到的事情。下面的程序生成此输出:
x: 123456fe ~x: 87654301 !x: 556677ff
x: 123456ff ~x: 87654301 !x: 556677fe
对于 X 中的任何字节值,~X 似乎总是用 01 覆盖整个字节。!然而,X 似乎只补充了字节的 LSB......
我想如果将布尔值转换为 int,应用按位补码,并将结果转换回布尔值,这是有道理的。 但是,我不明白为什么一个结果会将 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: %08xn", x.i, y.i, z.i);
x.i = 0x123456ff;
y.b = ~x.b;
z.b = !x.b;
printf("x: %08x ~x: %08x !x: %08xn", x.i, y.i, z.i);
}
从以前未分配到的联合成员读取是未定义的行为。
在联合中,最多一个非静态数据成员可以随时处于活动状态,也就是说,最多一个非静态数据成员的值可以随时存储在联合中。
当类型共享通用布局时,此规则有一个例外,这不适用于您的情况。通常,如果分配给x.i
,则只能从x.i
读取;如果要从x.b
开始读取,则需要先分配给x.b
。
我想如果将布尔值转换为 int,应用按位补码,并将结果转换回布尔值,这是有道理的。
这是 100% 正确的:下面的代码片段
bool b;
b = false;
printf("b: %dn", b);
b = ~b;
printf("~b: %dn", b);
b = ~b;
printf("~~b: %dn", b);
指纹
b: 0
~b: 1
~~b: 1
bool
提升为 int
,应用波浪号~
,然后使用通常的"零/不零"规则将结果转换回bool
。
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 一个关于在C++中重载布尔运算符的问题
- 提升精神:解析布尔表达式并简化为规范范式
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 线程之间的布尔停止信号
- 布尔比较运算符是如何在C++中工作的
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 隐式常量/非常量运算符布尔
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 如何在 c++ 中让布尔变量返回为 0 或 1 而不是真或假?
- 重载更少,则运算符返回相反的布尔值
- 将布尔变量添加到 int
- 为什么布尔开关语句有编译器警告?
- 将此布尔值传递给此函数的最有效方法是什么?
- 如何使布尔变量仅在设置为 true 时才为真?
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 当我尝试通过 arduino 上的引用传递布尔数组时出现问题
- ~ 运算符为布尔而努力