整型常量乘法及赋值问题
uchar temlteml&=0x0F; //先与掉高4位
//===处理方式1===正常
teml=(teml*10)/16;
//===处理方式2===不正常
teml=(teml*10)>>4;
//使用右移4位来代替除以16后得到的值与方式1不同
//===处理方式3===正常
teml=(teml*10u)>>4;
//将整型常量定义为无符号后才正常
//===处理方式4===正常
teml=teml*10;
teml>>=4;
//将处理方式2分成两步走也可以正常
//==========????
我估计是整型常量与uchar 型变量相乘后出现的位扩展在随后的右移及赋值截取中使数值出错
请大家帮忙分析出错原因,谢谢 就是你说的原因,你可以找对应汇编代码看一下。
tmel=13/14/15这三个值*10以后变成负数了吧。 第二个不正常就是因为中间变量被扩展到了int类型,是有符号的。 注意,有符号数运算时,用移位代替除法,这种做法在标准中是未定义的!注意到这点就好理解了 zhuzaixingfu 发表于 2013-11-20 21:35 static/image/common/back.gif
注意,有符号数运算时,用移位代替除法,这种做法在标准中是未定义的!注意到这点就好理解了 ...
谢谢,我已经知道自己错在哪了.不过我现在更想知道以前各种处理方式的详细过程,就是数值在整个过程中是怎么演变的. hitler 发表于 2013-11-20 15:40 static/image/common/back.gif
tmel=13/14/15这三个值*10以后变成负数了吧。
是的,我忽略了这个问题了,因为我弄不清,这个整型常量10在内存中是以什么形式存放的,我是说到底是8位还是16位,我用的是ICCAVR 6.31A
页:
[1]