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.

[参考译文] TMS320F28386D:CPU 和 CM 中无符号类型负整数转换差异

Guru**** 2459080 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/976596/tms320f28386d-unsigned-type-negative-integer-cast-difference-in-cpu-and-cm

器件型号:TMS320F28386D

您好!

我发现以下代码的结果是 CPU1和 CM 之间的差异。

unsigned short a = 0;
unsigned short b = 1;
unsigned short c1 = (a-b) % 0x2000;
unsigned short c2 = (Uint16)(a-b) % 0x2000;
在 CM 中:
  1. C1=65535 ( 不是预期值)
  2. C2=8191 (预期)

在 CPU1中:

  1. C1=8191 (预期)
  2. C2=8191 (预期)

以下有关 CM 中 C1的步骤是否正确?

1.(a-b)被添加到一个有符号 short->-1的临时变量中。

2.-1 % 0x2000 =-1

3.-1 标记为无符号 C1->65535

这是 C28x 和 CM 之间的预期差异吗? 是否有任何有关 这方面的文档说明?

谢谢

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

    您好!

    CLA int 为32位宽、CPU int 为16位宽。 考虑 C 整数促销规则。 unsigned short a - unsigned short b 触发整数升级到(signed) int、结果为-1、而不是65535。

    -1 % 8192 =-1、或存储回 ushort 65535。

    Edward

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

    是的、这是预期的。

    我假设您将 C28x 内核称为 CPU1、将 Cortex-M 内核称为 CM。

    需要记住的关键事项是:

    1. C28x 上"int"的大小为16位
    2. Cortex 上"int"的大小为32位
    3. 秩小于"int"的类型上的整数算术是使用"int"或"unsigned int"类型执行的、具体取决于涉及的类型。

    考虑表达式"(a-b)"。  C 标准要求将 a 和 b 的值转换为"int"或"unsigned int"、然后才能执行减法。

    在 Cortex 上、"无符号短整型"小于"int"、因此在以"int"类型执行运算之前、a 和 b 都转换为"int"。  总的来说、表达式的处理方式与写入表达式的处理方式完全相同:

    ((int) a-(int) b)%(int) 0x2000 ->(int)-1 

    然后、将值(int)-1转换为无符号短整型、得出观测值65535。

    另一方面、在 C28x 上、"unsigned short"不小于"int"、因此 a 和 b 都转换为"unsigned int"、然后在"unsigned int"类型中执行运算。  

    ((unsigned int) a-(unsigned int) b)%(unsigned int)(int) 0x2000 ->(unsigned int) 8191 

    如果依赖代码来执行无符号模数运算、则修复程序就是您为 C2所做的操作、将表达式(a-b)转换为无符号短整型。  或者、按如下方式编写:

    unsigned short a = 0;
    unsigned short b = 1;
    unsigned short t = a-b;
    unsigned short c1 = t % 0x2000; 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    好的、谢谢。

    unsigned short t = a-b;

    此表达式是否与(a-b)相同、即 a 和 b 在执行减法之前都改为"int"或"unsigned int"?


    如果 a 和 b 类型都是"unsigned long"、则在减法之前它是否仍转换为"unsigned int"?


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

    是的、相同的规则仍然适用于 a-b、但通过将中间结果分配给一个"无符号短整型"变量、值-1被截断为您期望的无符号16位值0xFFFF。