duljsky 发表于 2017-12-11 10:43

DSP类型强制转换问题

本帖最后由 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

DSP的数据类型
https://bbs.21ic.com/icview-556056-1-1.html

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 的计算呢?
这样讨论不合适吧
页: [1]
查看完整版本: DSP类型强制转换问题