C++ (bool)(i&;1)和i%2==1是否相同?
C++ (bool)(i&;1)和i%2==1是否相同?,c++,c,cross-platform,C++,C,Cross Platform,(bool)(i&1)和i%2==1在i为int时是否始终相同 注:我总是指所有平台(即使当字节为16位),对于所有C和C++标准。 编辑: < C > C++所有标准中, BOOL 存在。 NO./P> 1s'补码表示int,表示-1是1。。。10,因此它们有所不同 无论如何,i%2对于负数i可以是负数(事实上,当它不是0时,它必须在C99中),因此对于负数奇数不等于1。否 例如,如果我是-1,请尝试-1%2==-1,(bool)(-1&1)是1 (假设2-补码)你确定吗?我认为编译器可以处理
(bool)(i&1)
和i%2==1
在i
为int
时是否始终相同
注:我总是指所有平台(即使当字节为16位),对于所有C和C++标准。
编辑:
< C > C++所有标准中,<代码> BOOL 存在。NO./P> 1s'补码表示
int
,表示-1是1。。。10
,因此它们有所不同
无论如何,i%2
对于负数i
可以是负数(事实上,当它不是0时,它必须在C99中),因此对于负数奇数不等于1。否
例如,如果我是-1,请尝试<代码>-1%2==-1,(bool)(-1&1)
是1
(假设2-补码)你确定吗?我认为编译器可以处理这个差异。+1:这是正确的答案。(您已经确定了它们可能不同的两个原因!)@Kiril:按位运算符处理值的位表示。如果
-1&1
是1,那么无论底层硬件对该主题的看法如何,C实现都不会使用1的补码。它在模拟2s的补码或符号大小。@Kiril:
对符号类型的定义非常有限-将
与负LHS一起使用是实现定义的结果。所以是的,它们是不安全的。C99中的6.5.7/4和/5。在有符号类型上使用位运算的代码无论如何都是非常糟糕的,除非是由于剧烈优化的原因,因此完全是特定于实现的,因此您不需要它的可移植性。按位使用无符号类型,或者至少要求值为非负,这样您就可以确切地知道表示形式是什么。也就是说,除了2的补码以外的任何东西都是极为罕见的,因此记录代码“仅可移植到2的补码实现”不太可能给用户带来不便。bool
不是C中预定义的。您需要#包括将其定义为\u bool
的类型(\u bool
是C99语言的一部分)@pmg:是的,但是如果有人问一个关于printf
的问题,我不会说,“printf
在C中不是预定义的。你需要#包括”。但是,在“C的所有标准”中谈论bool是错误的,因为它在C89中没有任何形式:-)对:这就是我的意思---
bool
在C的所有标准中都不是预定义的:)更好地使用I%2!=0来测试奇数。