缩小从char到uint8_t的转换

时间:2013-03-31 14:06:36

标签: c++ c++11 narrowing

使用C ++ 11(演示here)编译以下代码段:

#include <stdint.h>

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

将触发警告(至少在GCC 4.7上),表示将'\xf2'转换为uint8_t时转换范围正在缩小。

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

请注意,在使用'\x02'之类的其他字面文字时,没有警告。

2 个答案:

答案 0 :(得分:5)

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

此:

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

编译正常。

答案 1 :(得分:3)

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

warning: narrowing conversion of ‘'\37777777762'’

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