[DSP编程] DSP类型强制转换问题

[复制链接]
2741|13
 楼主| duljsky 发表于 2017-12-11 10:43 | 显示全部楼层 |阅读模式
本帖最后由 duljsky 于 2017-12-14 09:08 编辑

情况1 无符号之间相减
unsigned short a = 1;
unsigned short b = 0xfffe;
unsigned short c = a - b;
printf("%x", c);
结果输出为3;

情况2 无符号之间相减并进行强转
unsigned short a = 1;
unsigned short b = 0xfffe;
unsigned int c = (unsigned int)(a - b);
printf("%x", c);
输出结果为ffff0003;

情况3 无符号之间相减后先转换成16位再强转32位
unsigned short a = 1;
unsigned short b = 0xfffe;
unsigned int c = (unsigned int)(unsigned short)(a-b);
printf("%x", c);
输出结果为3;
以上是在电脑在线编译得到的结果!
这是我的分析:
(前提)计算机只存储补码,究竟是有符号还是无符号数会根据声明自动辨认!
所以,两个无符号数相减实际上是做了a+(-b),是按各数的补码来算的;
情况1 a的补码为1不变,(-b)的补码为各位取反后+1,即2,所以结果为3;
情况2 和情况1不同的是又一个强转的操作,导致加减运算前各变量先进行了自身的转换,
即a的32位补码为0x00000001,(-b)的32位补码(各位取反再+1)为(0xffff0001+1),
所以结果为0xffff0003;
情况3 是先16位之间操作再转换成32位,最后结果是预期的3,同1,也验证了情况2;


但是在DSP中,对情况2进行编译,结果输出为3,并不是0xffff0003,请问是怎么回事,和编译器有关吗,用的CCS3.3!!!
最终得出结论,确切的说是和CPU的位数有关,在做加减运算时,会先转换成当前CPU位数的int型再进行运算,DSP的是16位,也就是int类型为16位的,在线编译的程序表明int是32位的,这样就和编译器没有关系了!
 楼主| duljsky 发表于 2017-12-11 10:51 | 显示全部楼层
@zhangmangui 求大神们解答一下~
 楼主| duljsky 发表于 2017-12-11 13:22 | 显示全部楼层
大家怎么都看帖不回帖啊
自己顶起来~
zhangmangui 发表于 2017-12-11 22:17 | 显示全部楼层
zhangmangui 发表于 2017-12-11 22:25 | 显示全部楼层
数据类型不一样   类型2你看看DSP数据类型中还是16bit  所以是3
 楼主| duljsky 发表于 2017-12-12 11:41 | 显示全部楼层
zhangmangui 发表于 2017-12-11 22:25
数据类型不一样   类型2你看看DSP数据类型中还是16bit  所以是3

版主,我贴出来的只是在线编译的例子;
DSP中是这样写的:
typedef unsigned int            UINT16;     /**< Typedef for 16bits unsigned integer */
typedef unsigned long int       UINT32;     /**< Typedef for 32bits unsigned integer */

UINT16 sumcount; /**< The count of pulse , range:default */
UINT16 lastCapTime; /**< The timestamp of last captured pulse, in microsecond, range:default */
UINT32 PulseWidth;

PulseWidth = (UINT32)(sumcount - lastCapTime);

这不就是第二种情况了吗?可结果是没有像情况2那样,按说应该是0xffff0003的  可结果是3!
zhangmangui 发表于 2017-12-12 22:30 | 显示全部楼层
duljsky 发表于 2017-12-12 11:41
版主,我贴出来的只是在线编译的例子;
DSP中是这样写的:
typedef unsigned int            UINT16;     ...

编译器不同的原因   也就是将UINT16强制转换为UINT32时    高位补零了  
kingkits 发表于 2017-12-13 13:19 | 显示全部楼层
这结果估计时你自己猜想的
 楼主| duljsky 发表于 2017-12-13 13:42 | 显示全部楼层
kingkits 发表于 2017-12-13 13:19
这结果估计时你自己猜想的

哪个结果?

其实我分析的也有点问题!应该是类型强转时,当前类型都是先转换成当前机器的int型,再进行运算,也就说明了为何在线编译出现的问题,DSP并没有出现,因为DSP的int是16位的,在线编译的程序中int是32位的,所以,DSP在做减法运算时先转换成16位的int再做运算,运算结果再强转。而我贴出的在线的例子,是先转换成32位的int再做运算;
kingkits 发表于 2017-12-13 16:09 | 显示全部楼层
你确定 0xfffe - 1 = 3?
 楼主| duljsky 发表于 2017-12-14 09:07 | 显示全部楼层
kingkits 发表于 2017-12-13 16:09
你确定 0xfffe - 1 = 3?

编辑失误!小数减大数
airwill 发表于 2017-12-20 22:51 | 显示全部楼层
情况2 无符号之间相减并进行强转
unsigned short a = 1;
unsigned short b = 0xfffe;
unsigned int c = (unsigned int)(a - b);
printf("%x", c);

应该是3

如果是
unsigned int c = (unsigned int)a -  (unsigned int)b;
输出结果应该为 ffff0003;
 楼主| duljsky 发表于 2017-12-21 09:45 | 显示全部楼层
airwill 发表于 2017-12-20 22:51
情况2 无符号之间相减并进行强转
unsigned short a = 1;
unsigned short b = 0xfffe;

我这不是在DSP下输出的,是在浏览器的在线编译器中测试的结果!
https://c.runoob.com/compile/11
这是链接,可以试试~
airwill 发表于 2017-12-21 17:59 | 显示全部楼层
干吗用其他地方的计算来描述 DSP 的计算呢?
这样讨论不合适吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

127

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部