为什么一个8位变量被编译成了16位变量?

4

我正在接手一个使用 TI C2000 的旧项目。编译一切正常,设置断点,单步调试也没有问题。

直到今天我发现了一个奇怪的问题:我定义了一个 unsigned char 类型的变量,但是在进行简单计算时却出现了错误。我设置了断点,并发现编译器将其转换为了 16 位变量。

但 8 位数组却可以正常编译为 8 位。

这里附带了截图: enter image description here

如果在软件中将其视为 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 才能使软件正常工作。


1
可能是关于C++中unsigned char类型大小的问题的重复。 - Iłya Bursov
3
我看不出代码有什么问题,但你需要提供一个最小完整可编译的示例。代码片段中未定义Safetyword。你使用的是哪个编译器和选项? - doug
1
检查无符号字符的大小。如果它不是你的代码所期望的8位,那么可能会发生这种情况。也有可能是16位。虽然不寻常,但是合法的。 - doug
1
DSP内核以其独特的方式运行,这个页面非常不错:https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/317030?Type-Sizes-on-Concerto-cores - Hans Passant
您是指“但无法正确进行简单的计算”吗? - chux - Reinstate Monica
显示剩余3条评论
1个回答

4

在这个平台上,1字节等于16位,因此unsigned char是一个16位类型。 buf是一个由四个16位值组成的数组。


那解释了一切! - doug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接