我遇到了一个代码original link of code,其中的部分内容对我来说并不清楚。
bool f; // conditional flag
unsigned int m; // the bit mask
unsigned int w; // the word to modify: if (f) w |= m; else w &= ~m;
w ^= (-f ^ w) & m;
// OR, for superscalar CPUs:
w = (w & ~m) | (-f & m);
现在,在行w ^= (-f ^ w) & m;
和行w = (w & ~m) | (-f & m);
中,他们使用了-f
。当我尝试不使用-f
并且只使用f
时,它给了我相同的答案。即使我在初始化-f
的值后尝试打印f=true/false
,它仍保留一些并且不会更改。有人可以告诉我-f
这里有什么意义。
答案 0 :(得分:2)
您引用的代码似乎假设(unsigned int)(-true)
将评估为UINT_MAX
。 C标准没有这样的保证,(-true)
的值可以是二进制表示全为1的任何值,包括值1
。
-(unsigned int)f
应该给你正确的答案。
当您将无符号值设置为-1
时,会添加最大值+ 1,因此它将成为该类型的最大值,即所有位设置为1的值。-0
显然等于0
。因此,在上面的第一个表达式中,f
的值应该控制(-f ^ w)
是评估为~w
还是w
。
答案 1 :(得分:1)
我能够从http://tigcc.ticalc.org/doc/opers.html#unarypm找到这个描述:
一元加减运算符('+'和' - ')
在这些一元+ - 表达式中
+ expr - exprexpr操作数必须是算术类型。结果是在一元加('+')运算符的任何必需的整数提升之后的操作数的值,或者对于一元减号(' - ')运算符的任何所需的整数提升之后的操作数的负值。使用fneg函数在内部执行浮点否定。
请注意,'+'和' - '运算符也有二进制形式。