模数或余数%符号值是否始终与该值的运算符减1相同?

use*_*580 1 c signed ida and-operator modulus

这是一些示例代码

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

负数给出了不同的结果,这是关于它的,但除此之外,它们总是对所有正值都起到完全相​​同的作用吗?

即使对于负数,它们似乎也只是总是偏离1循环.

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

这使用的负值高于模数值,是的只适用于正值.

我从IDA-PRO中发现这个Hex-Ray的反编译器似乎有时会生成一个模数%,有时会生成AND &两个相同源代码的运算符.我想这是来自优化器.

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

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

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

Pas*_*uoq 6

的优化x % N,以x & (N-1)仅工作,如果N是二的幂.

您还需要知道这x是正数,否则位掩码操作和余数操作之间会有一点差别.位掩码操作产生欧几里德除法的余数,它总是正的,而%产生C的除法的余数/,它向零舍入并产生有时为负的余数.