两段代码具有相同的逻辑。一个给出预期的输出而另一个没有

时间:2016-02-19 15:31:58

标签: c++

char xtime(char m)
{
    //calculates the m value by checking m,if m is less than 0x80 hexadecimal
    // then it is left shifted else it is left shifted and xor'ed with 0x1b.
    if(m<0x80)
    {
        m<<=1;
    } else {
        m=(((m)<<1)^0x1b);
    }

    printf("%#01x ",m&0xff);
    return m;
}

如果m = 0x80(即0x1b),则此代码不显示预期输出,它以十六进制输出为0。

#define xtime(a) (((a)<0x80)?(a)<<1:(((a)<<1)^0x1b) )

此代码有效并提供预期结果。

请问有关功能代码有什么问题以及如何在第二段代码中解决问题。

1 个答案:

答案 0 :(得分:2)

假设在你的环境中

  • char已签名
  • char是8位长
  • 两个赞美用于表示负整数
  • 如果要转换的有符号整数不能存储原始值,则高位将被丢弃

0x80太大而无法存储到char变量中,它将被解释为-128-128小于0x80,因此执行m <<= 1;。 此转变的结果为-256,其二进制表示为0xffffff00m将获得最后8位,即0。这就是你得到的。

如果将0x80传递给a,宏将会有效,因为计算将使用int完成,而int可以保持整数至少为{{1} }}