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))也有对运算溢出值直接砍掉位的描述:
我和其他工程师讨论一下再给您答复。
,
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。