Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ (bool)(i&;1)和i%2==1是否相同?_C++_C_Cross Platform - Fatal编程技术网

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来测试奇数。