【问题标题】:Why a 8 bit variable got compiled as a 16 bit variable? [closed]为什么 8 位变量编译为 16 位变量? [关闭]
【发布时间】:2019-01-11 22:29:52
【问题描述】:

我正在接管一个使用 TI C2000 的旧项目。编译一切正常,设置断点,单步执行没问题。

直到今天发现一个奇怪的问题:我定义了一个unsigned char 变量,但是可以得到一个简单的计算正确。我设置了一个断点,发现编译器把它变成了一个 16 位变量。

但是8位数组编译成8位没问题。

此处附上屏幕截图:

如果我在软件中将其视为 16 位,一切都很好。 但我以前从未遇到过这类问题。

源码在这里:

    //check CRC
    unsigned char buf[4];
    unsigned char crc;
    buf[0] = commandWord >> 8;
    buf[1] = commandWord & 0xff;
    buf[2] = data[0] >> 8;
    buf[3] = data[0] & 0xff;
    crc = crc8(buf, 4);

    if (0xf000U == (safetyWord & 0xf000U)) {
        if ((crc & 0x00ff) == (safetyWord & 0x00ff)) {
            ret = TLE_SUCCESS;
        } else {
            ret = -1;
        }
    } else {
        ret = -1;
    }

我必须使用crc & 0x00ff 才能使软件正常工作。

【问题讨论】:

  • 我看不出代码有什么问题,但您确实需要包含一个最小的、完整的、可编译的示例。代码 sn-p 中没有定义安全词。您使用的是什么编译器和选项?
  • 检查无符号字符的大小。如果它不是您的代码所期望的 8 位,则可能会发生这种情况。可能是16位。不寻常,但合法。
  • 您确定crc8 返回unsigned char 吗?也许它返回一个charsigned char,这是让事情变得无聊的转换。
  • 众所周知,DSP 内核向不同的鼓手进军。这个页面还不错:e2e.ti.com/support/microcontrollers/c2000/f/171/t/…

标签: c compiler-construction


【解决方案1】:

On this platform 1 个字节是 16 位,所以unsigned char 是 16 位类型。 buf 是一个由四个 16 位值组成的数组。

【讨论】:

  • 这说明了一切!
猜你喜欢
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 2013-03-27
  • 2013-05-18
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 2015-01-25
相关资源
最近更新 更多