Chinaunix
标题:
今天调试时遇到的问题。大家学习下吧。
[打印本页]
作者:
star1983653
时间:
2010-10-04 21:18
标题:
今天调试时遇到的问题。大家学习下吧。
程序的一部分,是比较2个无符号字符数组。
看1个数组每个元素是不是另一个数组对应的元素取反。
我是这么写的
if(pos[i] != ~neg[i])
复制代码
于是华丽的一直不通过。
后来查了汇编代码,发现是这么比较的
leal -40(%ebp), %eax
addl -12(%ebp), %eax
movzbl (%eax), %edx
leal -56(%ebp), %eax
addl -12(%ebp), %eax
movzbl (%eax), %eax
notl %eax
cmpl %eax, %edx
复制代码
问题出在那个notl上了。编译器是把2个无符号字符变量,movzbl扩展成4字节了。
于是取反后,华丽的neg
变成了0xFFFFFFXX。
改成
if((pos[i] ^ [neg[i]) != 0xFF)
复制代码
就OK了。
大家引以为戒吧。
{:3_196:}
作者:
tempname2
时间:
2010-10-04 21:26
字符在运算前都会提升为整形好像。。。。。
作者:
cobras
时间:
2010-10-04 21:47
如果pos和neg都是unsigned char类型的数组
则应该是编译器的BUG
应该编译为无符号扩展MOVZX
作者:
pengjianbokobe
时间:
2010-10-06 10:22
不错,学习了
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2