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位的,这样就和编译器没有关系了!
@zhangmangui 求大神们解答一下~ 大家怎么都看帖不回帖啊
自己顶起来~ DSP的数据类型
https://bbs.21ic.com/icview-556056-1-1.html 数据类型不一样 类型2你看看DSP数据类型中还是16bit所以是3 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!
duljsky 发表于 2017-12-12 11:41
版主,我贴出来的只是在线编译的例子;
DSP中是这样写的:
typedef unsigned int UINT16; ...
编译器不同的原因 也就是将UINT16强制转换为UINT32时 高位补零了 这结果估计时你自己猜想的 kingkits 发表于 2017-12-13 13:19
这结果估计时你自己猜想的
哪个结果?
其实我分析的也有点问题!应该是类型强转时,当前类型都是先转换成当前机器的int型,再进行运算,也就说明了为何在线编译出现的问题,DSP并没有出现,因为DSP的int是16位的,在线编译的程序中int是32位的,所以,DSP在做减法运算时先转换成16位的int再做运算,运算结果再强转。而我贴出的在线的例子,是先转换成32位的int再做运算; 你确定 0xfffe - 1 = 3? kingkits 发表于 2017-12-13 16:09
你确定 0xfffe - 1 = 3?
编辑失误!小数减大数 情况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;
airwill 发表于 2017-12-20 22:51
情况2 无符号之间相减并进行强转
unsigned short a = 1;
unsigned short b = 0xfffe;
我这不是在DSP下输出的,是在浏览器的在线编译器中测试的结果!
https://c.runoob.com/compile/11
这是链接,可以试试~ 干吗用其他地方的计算来描述 DSP 的计算呢?
这样讨论不合适吧
页:
[1]