GDSHAFU 发表于 2013-11-20 15:00:32

整型常量乘法及赋值问题

uchar teml

teml&=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 型变量相乘后出现的位扩展在随后的右移及赋值截取中使数值出错

请大家帮忙分析出错原因,谢谢

lusson 发表于 2013-11-20 15:08:51

就是你说的原因,你可以找对应汇编代码看一下。

hitler 发表于 2013-11-20 15:40:32

tmel=13/14/15这三个值*10以后变成负数了吧。

lcofjp 发表于 2013-11-20 15:51:27

第二个不正常就是因为中间变量被扩展到了int类型,是有符号的。

zhuzaixingfu 发表于 2013-11-20 21:35:12

注意,有符号数运算时,用移位代替除法,这种做法在标准中是未定义的!注意到这点就好理解了

GDSHAFU 发表于 2013-11-21 08:59:47

zhuzaixingfu 发表于 2013-11-20 21:35 static/image/common/back.gif
注意,有符号数运算时,用移位代替除法,这种做法在标准中是未定义的!注意到这点就好理解了 ...

谢谢,我已经知道自己错在哪了.不过我现在更想知道以前各种处理方式的详细过程,就是数值在整个过程中是怎么演变的.

GDSHAFU 发表于 2013-11-21 09:02:12

hitler 发表于 2013-11-20 15:40 static/image/common/back.gif
tmel=13/14/15这三个值*10以后变成负数了吧。

是的,我忽略了这个问题了,因为我弄不清,这个整型常量10在内存中是以什么形式存放的,我是说到底是8位还是16位,我用的是ICCAVR 6.31A
页: [1]
查看完整版本: 整型常量乘法及赋值问题