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) )
此代码有效并提供预期结果。
请问有关功能代码有什么问题以及如何在第二段代码中解决问题。
答案 0 :(得分:2)
假设在你的环境中
char
已签名char
是8位长 0x80
太大而无法存储到char
变量中,它将被解释为-128
。 -128
小于0x80
,因此执行m <<= 1;
。
此转变的结果为-256
,其二进制表示为0xffffff00
,m
将获得最后8位,即0
。这就是你得到的。
如果将0x80
传递给a
,宏将会有效,因为计算将使用int
完成,而int
可以保持整数至少为{{1} }}