无符号int零的位表示
bit representation of unsigned int zero
我遇到了一种行为,这是我在无符号整数上使用逐位运算时没有想到的。我将直接以我的例子为例。
unsigned int a = 0;
unsigned int b = 0;
std::printf("a & b: %un", a & b);
std::printf("a == b: %in", a == b);
std::printf("a & b == a: %in", a & b == a);
上述代码产生以下输出:
a & b: 0
a == b: 1
a & b == a: 0
最后一行让我困惑。既然a & b == (unsigned int)0
和a == (unsigned int)0
,a & b == a
不应该求值为true
吗?
您之所以会出现这种行为,是因为您没有意识到在C运算符优先级表中==
位于&
之前。事实上,一个好的编译器会立即警告你的代码:
t.cpp:10:35: warning: & has lower precedence than ==; == will be evaluated first [-Wparentheses]
std::printf("a & b == a: %in", a & b == a);
^~~~~~~~
t.cpp:10:35: note: place parentheses around the '==' expression to silence this warning
std::printf("a & b == a: %in", a & b == a);
^
( )
t.cpp:10:35: note: place parentheses around the & expression to evaluate it first
std::printf("a & b == a: %in", a & b == a);
^
( )
确保您的警告已打开,如g++ -Wall -Wextra -Werror
。
您应该写:
(a & b) == a
现在您将得到1,因为a & b
将首先进行评估:
CCD_ 9、CCD_。
在您的情况下,a & b == a
计算为a & (b == a)
,b == a
为1,a & 1
为0。
由于==
的优先级高于&
,a & b == a
被评估为a & (b == a)
(而不是您所期望的(a & b) == a
)。
相关文章:
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 使用 int 表示浮点除法 C++
- 是否可以保证按字节的零 int 是零的表示形式?
- 使用 int 指针的浮点数的位表示形式
- 如何检查 int 变量是否包含合法(非陷阱表示)值?
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 运行时错误:有符号整数溢出:964632435 * 10 无法在类型 'int' 中表示
- 在二进制表示中将二进制 std::string 转换为 int
- 由INT数据类型(低,高)结构表示的双数据类型
- 表示给定"int"的最小位数
- 为什么不能将 int(表示 ASCII 字符)转换为 std::字符串,而没有大括号环绕在 int 周围?
- 使用inet_pton()获取IPv4地址的无符号int表示形式
- 使用向量<对<字符串,int > >表示哈希表
- C/C++ int[] vs int*(指针与数组表示法).有什么区别
- 查找存储在长位中的最后一个int(1-9)(每个int由4位表示)
- c++帮助设计类ConstArray和Array,它们表示一种int值的动态数组
- 将 int 的所有字节设置为(无符号字符)0,保证表示零
- x[0] == 1 在 C++11 中表示 1 个常量表达式,当 x 是常量 int[]
- 前缀表示法字符串到int的转换
- BigInt实现-将字符串转换为存储为无符号int的二进制表示