使用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'
之类的其他字面文字时,没有警告。
答案 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'
删除警告。