打印
[DSP编程]

DSP类型强制转换问题

[复制链接]
2330|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 | 只看该作者

使用特权

评论回复
5
zhangmangui| | 2017-12-11 22:25 | 只看该作者
数据类型不一样   类型2你看看DSP数据类型中还是16bit  所以是3

使用特权

评论回复
6
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!

使用特权

评论回复
7
zhangmangui| | 2017-12-12 22:30 | 只看该作者
duljsky 发表于 2017-12-12 11:41
版主,我贴出来的只是在线编译的例子;
DSP中是这样写的:
typedef unsigned int            UINT16;     ...

编译器不同的原因   也就是将UINT16强制转换为UINT32时    高位补零了  

使用特权

评论回复
8
kingkits| | 2017-12-13 13:19 | 只看该作者
这结果估计时你自己猜想的

使用特权

评论回复
9
duljsky|  楼主 | 2017-12-13 13:42 | 只看该作者
kingkits 发表于 2017-12-13 13:19
这结果估计时你自己猜想的

哪个结果?

其实我分析的也有点问题!应该是类型强转时,当前类型都是先转换成当前机器的int型,再进行运算,也就说明了为何在线编译出现的问题,DSP并没有出现,因为DSP的int是16位的,在线编译的程序中int是32位的,所以,DSP在做减法运算时先转换成16位的int再做运算,运算结果再强转。而我贴出的在线的例子,是先转换成32位的int再做运算;

使用特权

评论回复
10
kingkits| | 2017-12-13 16:09 | 只看该作者
你确定 0xfffe - 1 = 3?

使用特权

评论回复
11
duljsky|  楼主 | 2017-12-14 09:07 | 只看该作者
kingkits 发表于 2017-12-13 16:09
你确定 0xfffe - 1 = 3?

编辑失误!小数减大数

使用特权

评论回复
12
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;

使用特权

评论回复
13
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
这是链接,可以试试~

使用特权

评论回复
14
airwill| | 2017-12-21 17:59 | 只看该作者
干吗用其他地方的计算来描述 DSP 的计算呢?
这样讨论不合适吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

127

帖子

1

粉丝