TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28069: TI 28069 编译 问题

Part Number:TMS320F28069

我目前使用TI 15.12.3.LTS 版本进行编译, 但遇到一个问题,觉得很危险,就是我使用Int16 定义了一个变量,比如Int16 current = 495;

然后定义float result = current * current, 

495*495 = 245025, 也就是0x3 BD21,但由于current 只有16 bit,编译器默认 current * current 的结果也只是使用16 bit 进行存储,于是变成0xBD21, 也就是 -17119 赋值给float 类型 的变量result ,显然这不是我所期望;

这里有什么选项可以设置,避免这一类问题吗? 或是升级编译器能解决这个问题吗?

Yale Li:

您先试一下强制类型转换:

float result = (float) current * (float) current;

,

user6049953:

强制类型转换是可以的,这个我知道的,关键是我的代码是从Tricore 代码弄过来的,一些编码在Tricore 可以输出正确结果,但是CCS 这边却输出不正确,我也很难每个表达式都去手工进行类型强制转换;

这个类型转换编译器不能自己去做吗?

,

Yale Li:

您好,我目前还没有找到解决方法,只找到一篇有关于正确编写乘法代码的说明文档:How to Write Multiplies Correctly in C Code

相关的编译器文档中(TMS320C28x Optimizing C/C++ Compiler v16.9.0.LTS (Rev. K))也有对运算溢出值直接砍掉位的描述:

J.3.5

我和其他工程师讨论一下再给您答复。

,

Yale Li:

您好,我们似乎找到问题的关键所在了。

Tricore内置的int类型是32位宽的,而C28x内置的int类型是16位宽的。

user6049953 说:float result = current * current

在Tricore执行上述操作时,int16先被转换成内置int(32bits),然后进行32位的乘法运算,结果不会溢出,最后赋值给float型的result;

而在C28x,int16与内置int(16bits)大小相同,所以不会发生类似上面的转换,直接进行16位乘法运算,结果溢出。

user6049953 说:这个类型转换编译器不能自己去做吗?

基于上述叙述,这个无法让编译器自动去实现。

给您更加合理的建议就是将int16改为int32。

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28069: TI 28069 编译 问题
分享到: 更多 (0)