BYTE CICCard::ByteBCD(const int Num)
{
int i;
i=Num;
return   BCD(i) | BCD(i) << 4;
}BYTE CICCard::BCD(int &Num)
{
int i=0;
i=Num%10;
Num/=10;
return i;
}比如我输入一个int型的数23,通过调用这两个函数,出来的结果应该是16进制数0x23,
但在release中结果却为0x32,我一直想不通。
release 似乎对变量的初始化要求比较严一些。还有如果进行位操作,会不会有什么区别?
另外,我想找出原因 ,想对release 进行调试,有什么办法可以设定,对release进行调试。
这个问题困扰我好久了。大家踊跃探讨一下吧。多给分!!!

解决方案 »

  1.   

    可能是因为release版做了优化,你的BCD修改了Num的值,不容易看出次序:改为试试看:
    BYTE CICCard::ByteBCD(const int Num)
    {
    int i;
    i=Num;
             BYTE bResult=BCD(i);
             return bResult|BCD(i) << 4;
    }
      

  2.   

    return   BCD(i) | BCD(i) << 4;// return 2|3<<4;
    0000 0010  |   00110000   =  0011 0010
    不就是 0x32 么?
      

  3.   

    BYTE CICCard::ByteBCD(const int Num)
    {
    int i;
    i=Num;
    //return   BCD(i) | BCD(i) << 4;
    /* if i = 23 then bcd(i) = 3 and bcd(i)<<4 = 3 << 4 = 48 = 0x30*/
    return BCD(i/10)<<4 + BCD(i);
    /* now bcd(i/10)<<4=0x20 the result is 0x23*/
    }BYTE CICCard::BCD(int &Num)
    {
    int i = 0;
    i = Num % 10;
    Num /= 10;
    return i;
    /* if Num = 23 then i = 3 */
    }
      

  4.   

    但是为什么在debug版本中就没有事呢?
    而且我的程序其它地方只要用到位操作和移位,也会出现出来的结果不是预期的结果的现象,大家能不能告诉我怎样才能避免这种情况。
    各位在编程中有没有遇到我这样的情况,怎样避免,大家都谈谈自己的看法吧。
      

  5.   

    引述一个老兄的话:
    DEBUG版和RELEASE版的生成代码是不同的,你只好去调试release 版了,别怕,有点窍门:
    在release版的Project settings里,把C/C++设置的debug info 设为Program database,
    在link设置里选Generate debug info, 这样你就可以看着源码来调试release版,
    而不用看着反汇编来调试那么辛苦。由于release版一般是优化过的,所以有时你检查变量
    数值时所显示的数值不一定就是该变量当前的数值,但是程序执行顺序是不变的,如果真的
    要看其准确的数值的话,用反汇编来看,也许是在某个register里。 调试完毕之后,把link
    设置的generate debug info给去掉,重新link一下就行了
      

  6.   

    to:  everandforever(Forever) (  )
    return   BCD(i) | BCD(i) << 4;// return 2|3<<4;
    0000 0010  |   00110000   =  0011 0010
    不就是 0x32 么?  //上面的两个BCD()调用有先后区别吗?怎么区分的?谢谢!
      

  7.   

    为防止release版对某变量优化,可用volatile
    如:volatile int Data;
    编译器就不会随便对变量Data作优化了。