器件型号: TMS320F28377D
主题中讨论的其他器件: test2.
您好、
在浏览社区时、我遇到了下面链接的主题、并在 TI 工程师的回复方面遇到了一些技术问题。
在原始帖子中,作者提供了以下常量定义和代码片段:
#define CURRENT_SAMPLE_DEFAULT_OFFSET_MAX 39321 // 32768 * 1.2
volatile int32_t temp2;
temp2 = CURRENT_SAMPLE_DEFAULT_OFFSET_MAX; // temp2 = 2457
我阅读了 TI 工程师对此的解释、但我有点困惑。
在 TMS320F28x MCU 上、即使我们将宏定义为裸十进制字面量并将其分配到如上所示的 32 位变量、值 39321 也会成功且正确地存储在 temp2 中。 根据 C 标准规范、未添加后缀的十进制整数字面量的类型被自动确定为 int→long int→long long int 序列中可以完全表示其值的第一种类型。 由于 39321 超出有符号 16 位 int (32767) 的最大值、因此它固有地应被视为 32 位 long int。
即使值 39321 作为 16 位类型处理并发生截断、结果仍然不会是 2457。 (当然,如果将该值分配给一个 12 位寄存器、0x9999 将被截断为 0x0999、这说明了值 2457 的来源。)
如果我们执行编译时算术运算、这些运算会在不进行显式转换的情况下溢出 16 位限制、则会发生由于溢出而导致的截断、如下例所示。 但是、即使在这些情况下、TI 编译器也会在编译过程中通过特定的警告消息来提醒用户:
#define TEST1 (30000 * 30000)
#define TEST2 (0x4120 << 8)
volatile int32_t temp1, temp2;
temp1 = TEST1; // temp1 = -5888 (Truncated)
temp2 = TEST2; // temp2 = 8192 (Truncated)
【编译器警告】
“xxx.c“、第 nnn 行:警告#62-D:整数运算结果超出范围
(虽然在定义常量时连接 L 或 UL 等后缀是防止示例等截断现象的正确方法和良好习惯) 考虑到这种编译器行为和用于字面提升的 C 标准规则、原始 TI 响应中提供的说明是否完全准确? 或者这里缺少一些特定于 C2000 的编译器行为吗?
我希望就此问题作进一步澄清。
此致、
Sang-il