This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
器件型号:TMS320VC5502 (不是 TMS320VC5402、抱歉、拼写错误!)
工具/软件:Code Composer Studio
我将 CCS 3.2项目转换为 CCS 8.0。 转换后的工程抛出以下错误:
错误#175:浮点值不适合所需的积分类型
当对"接近" 32位有符号整数(long)的上限范围的浮点常量执行类型转换时、会发生错误。 当浮点值介于(long_MAX - 64) 和 long_MAX 之间时、编译器会发出提示。 编译器对该范围内的整数常量感到满意。 以下是一些示例:
long test1 =(long) 2147483583;//确定
long test2 =(long) 2147483583.0;//确定
long test3 =(long) 2147483583.9;//确定
long test4 =(long) 2147483584.0;//错误#175
long test5 =(long) 2147483584;//确定
long test6 =(long) 2147483646;//确定
long test7 =(long) 2147483646.0;//错误#175
long test8 =(long) 2147483646.9;//错误#175
long test9 =(long) 2147483647.0;//错误#175
long test10 =(long) 2147483647;//确定
这些结果是使用 cl55.exe 的 v4.4.1生成的。
这是编译器错误还是对某些隐式转换规则的新的、更严格的解释?
感谢您将此问题告知我们。 我可以重现相同的行为。 C5500编译器处于非活动状态。 错误不再修复。 但是、受支持的 C2000编译器也存在相同的问题。 因此、我针对 这两种编译器在 SDOWP 系统中提交了 CodeGen-4690。 这一问题的原因在两个编译器中几乎都是相同的。 在 C2000编译器中修复它可能(不保证!) 揭示 C5500编译器的权变措施。 欢迎您在我的签名中使用下面的 SDOWP 链接跟踪问题。
谢谢、此致、
乔治
这里的问题是 C5500代表32位 IEEE 格式的所有三种浮点类型(浮点型、双精度型和长双精度型)。 这无法提供足够的精度来准确表示2147483583.0等 当从文本转换为32位 IEEE、然后转换为整数时、2147483583.0的结束值小于 long_MAX、但2147483584.0的结束值大于 long_MAX。 (具体而言、是2147483520和2147483648。 请注意、2147483520为24个1位、32位 IEEE 为24位尾数。)
我无法回答为什么您对 CCS 3.2没有相同的问题。 可能在转换过程中发生了一些变化、可能早期编译器忽略了该问题、可能其他问题也不同。
C2000还使用32位 IEEE 进行浮点和双精度运算、但使用64位 IEEE 进行长双精度运算。 对于该平台、2147483583.0L 是指定将常数干净转换为长整型的方法。 遗憾的是、C5500没有64位浮点类型、无法使用该技术。
可能要做的是将 long_MAX 转换为浮点值、将其存储在某个位置、然后在转换中通过键入来首先根据该浮点值进行测试。 正数如下所示:
const float longMaxAsFloat =(float) long_MAX; long ConvertFloatToLong (float Float) { if (Float >= LongMaxAsFloat) return long_MAX;
/*可能也需要对负数进行一些处理*/
返回(长)浮动; }
尊敬的 pf:
感谢您的跟进。 此问题出现在#define 宏中,该宏将浮点常量转换为定点整数表示(例如:#define Q30(x)...)。 旧编译器可以毫无怨言地将尾数截断为24位、而新编译器会将其视为错误。 我将尝试向宏添加一些位掩码和位移、使其与新编译器配合使用。
Joe