2

使用 C++11 编译以下代码片段(此处为演示):

#include <stdint.h>

int main() {
    const uint8_t foo[] = {
        '\xf2'
    };
}

将触发警告(至少在 GCC 4.7 上),表明转换'\xf2'uint8_t.

为什么是这样?sizeof(char)is always 1,应该与 相同sizeof(uint8_t),不是吗?

请注意,当使用其他字符文字时,例如'\x02',没有警告。

4

2 回答 2

5

尽管 char 不一定必须是 8 位长,但这不是问题所在。您正在从转换signed char为无符号(uint8_t),这就是错误的原因。

这:

const int8_t foo[] = {
    '\xf2'
};

会编译得很好。

于 2013-03-31T14:14:58.550 回答
3

查看我的系统,常量\xf2溢出,因为它超出了有符号字符的范围。它被表示为-14which 然后隐式转换为 unsigned int,给出 4294967282 的值。然后缩小为 a char,产生以下警告:

warning: narrowing conversion of ‘'\37777777762'’

使用(unsigned char)'\xf2'删除警告。

于 2013-03-31T14:35:41.227 回答