Chinaunix

标题: 今天调试时遇到的问题。大家学习下吧。 [打印本页]

作者: star1983653    时间: 2010-10-04 21:18
标题: 今天调试时遇到的问题。大家学习下吧。
程序的一部分,是比较2个无符号字符数组。
看1个数组每个元素是不是另一个数组对应的元素取反。
我是这么写的
  1. if(pos[i] != ~neg[i])
复制代码
于是华丽的一直不通过。
后来查了汇编代码,发现是这么比较的
  1. leal         -40(%ebp), %eax
  2.           addl        -12(%ebp), %eax
  3.           movzbl        (%eax), %edx
  4.           leal                -56(%ebp), %eax
  5.           addl        -12(%ebp), %eax
  6.           movzbl        (%eax), %eax
  7.           notl        %eax
  8.           cmpl        %eax, %edx
复制代码
问题出在那个notl上了。编译器是把2个无符号字符变量,movzbl扩展成4字节了。
于是取反后,华丽的neg变成了0xFFFFFFXX。
改成
  1. 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