当变量i为int类型时,表达式
(bool)(i & 1)
和 i % 2 == 1
是否相同?请注意:“始终”指所有平台(即使一个字节为16位)和C、C++的所有标准都一样。编辑后的说明:在支持 bool
类型的所有 C 和 C++ 标准中都是如此。(bool)(i & 1)
和 i % 2 == 1
是否相同?请注意:“始终”指所有平台(即使一个字节为16位)和C、C++的所有标准都一样。编辑后的说明:在支持 bool
类型的所有 C 和 C++ 标准中都是如此。不。
int
的1s' 补码表示方式中,-1的表示形式为1 ... 10
,因此它们是不同的。
无论如何,对于负数i
,i%2
可以是负数(实际上在C99中当它不等于0时必须是负数),因此不等于负奇数的1。
<<
和>>
有相当受限的定义——使用负的左操作数进行<<
操作是未定义行为。使用负的左操作数进行>>
操作则是实现定义的结果。因此,它们是不安全的。C99标准6.5.7/4和/5。 - Steve Jessop>>
和 <<
)。所以,你的意思是,如果我需要解析一个头部(例如从套接字接收到的数据),并且头部大于1B,我不能只使用 &
检查某个具体位,而且还需要检查补码然后再使用 &
吗?我很震惊。 - Kiril Kirov例如,当 i 为 -1 时,请尝试运行以下代码:-1 % 2 == -1
,(bool) (-1 & 1)
的结果为 1。
(假设采用二进制补码表示法)
bool
不是预定义的。你需要#include <stdbool.h>
,它将其定义为_Bool
(_Bool
是 C99 语言的一部分)。 - pmgprintf
在C中没有预定义。你需要#include <stdio.h>
”。然而,在“所有C标准”中谈论布尔变量是误导人的,因为它在任何形式上都不在C89中。 - Steve Jessopbool
并非在所有的 C 标准中都被预定义 :) - pmgi % 2 != 0
来测试奇数。 - starblue