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.

[参考译文] TMS320F28377D:有关 TI E2E 主题#1644136 中整数溢出和文字键入的问题

Guru**** 2941480 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1652653/tms320f28377d-question-regarding-integer-overflow-and-literal-typing-in-ti-e2e-thread-1644136

器件型号: TMS320F28377D
主题中讨论的其他器件: test2.

您好、

在浏览社区时、我遇到了下面链接的主题、并在 TI 工程师的回复方面遇到了一些技术问题。

Thread URL: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1644136/tms320f28p650dk-the-program-for-tms320f28p650dk

在原始帖子中,作者提供了以下常量定义和代码片段:

#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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Fleenor:

    为了澄清一下、我最初并未发布主题 1644136、因此我没有关于该特定案例的完整背景详细信息。 我只是在搜索社区论坛的相关信息时遇到它,并决定提出一个后续问题,因为之前的回答似乎有点不清楚。

    不管怎样、您的解释有助于我更好地理解和澄清问题。

    感谢你的帮助。

    此致、
    Sang-il