这是一些示例代码
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
因为任何带有正值的模数似乎都是错误的,我认为没有人会使用带有负值的模数,它看起来对眼睛没有吸引力。所以我想这是最好的。