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
因为具有正值的模数似乎是错误的我认为没有人会使用具有负值的模数它看起来对眼睛没有吸引力.所以我猜这是最好的.
的优化x % N
,以x & (N-1)
仅工作,如果N
是二的幂.
您还需要知道这x
是正数,否则位掩码操作和余数操作之间会有一点差别.位掩码操作产生欧几里德除法的余数,它总是正的,而%
产生C的除法的余数/
,它向零舍入并产生有时为负的余数.