1

这是一些示例代码

int test = 1234;
int modValue, andValue;
modValue = test % -8;
andValue = test & 7;
printf("Mod Value = %d And Value = %d\n", modValue, andValue);

int counter = 0;
for(counter = 0; counter < 10000; counter++) {
    modValue = counter % -8;
    andValue = counter & 7;
    if(modValue != andValue) {
        printf("diff found at %d\n", counter);
    }
}

ideone链接:http: //ideone.com/g79yQm

负数给出不同的结果,仅此而已,但除此之外,对于所有正值,它们的功能是否总是完全相同?

即使对于负数,它们似乎也只会被偏移 1 个循环轮次。

那些想知道它类似于这个问题的人为什么需要模运算符?问题,但我不减 1。

这使用高于模值的负值,并且仅适用于正值。

我从 IDA-PRO Hex-Ray 的反编译器中发现了这一点,它似乎有时会为两个相同的源代码在不同的函数中生成模数%,有时生成一个运算符。AND &我猜它来自优化器。

由于我反编译的这个项目甚至不应该使用负值,我想知道原始源代码是什么,怀疑有人使用带负值的模数虽然看起来很奇怪。

也使用And模数命令,我知道循环操作总是使用模数,但在这种情况下,人必须使用 aVal And 7因为Val % 7是完全不同的结果。

忘了说最有可能使用的原始代码,abs(Val) and 7因为任何带有正值的模数似乎都是错误的,我认为没有人会使用带有负值的模数,它看起来对眼睛没有吸引力。所以我想这是最好的。

4

2 回答 2

6

x % Nto的优化x & (N-1)只有在N是 2 的幂时才有效。

你还需要知道它x是正数,否则位掩码操作和余数操作有一点区别。位掩码运算产生欧几里得除法的余数,始终为正,而%产生 C 的除法的余数/,向零舍入并产生有时为负的余数。

于 2014-04-26T14:28:42.733 回答
1

结果的符号%取决于负操作数的机器,同样适用于上溢/下溢。/通过代理遵循相同的规则。

于 2014-04-26T14:30:50.343 回答