【发布时间】:2021-04-29 16:48:18
【问题描述】:
编辑:答案是,对有符号值的按位运算会做一些奇怪的事情!
在调试过程中,我注意到一个奇怪的差异,我已将其翻译成下面易于阅读的示例。
在我看来 var1 和 var2 应该是相同的:在调试器上仔细地单步执行之后,似乎 var1 和 var2 在第一次迭代中是相同的,但在第二次迭代中是不同的。我在尝试将“var2”的表达式转换为程序集时发现了这个错误,并注意到我的逻辑翻译(我用“var1”显示)给出了不同的结果。对我来说,“var1”的计算是对“var2”的复杂表达式的相同取消 - 我哪里出错了?
这是使用 Visual Community 2019、x64、调试编译的。
// x is an unsigned char, equivalent to the length of the string
// taking the null terminator into account
unsigned char var1 = x;
unsigned char var2 = x;
for (int i = 0; i < x; ++i) {
unsigned char temp1 = string[i];
unsigned char temp2 = var1 ^ temp1;
unsigned char temp3 = table[temp2];
var1 ^= temp3;
var2 ^= table[var2 ^ string[i]];
}
【问题讨论】:
-
var2^string[i]最终是 > 255?了解积分促销 -
制作
stringunsigned char* -
避免对有符号变量进行按位运算。
-
^执行整数提升,如果恰好是负数,您的string[i]将得到符号扩展。所以这将成为杂草:table[var2 ^ string[i]] -
问题中没有程序集。