1

考虑代码:

volatile unsigned int test;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
unsigned char arr[]={test&0xff};

在这里,无论有什么价值testtest&0xff都将始终适合unsigned char. 我仍然收到编译器警告:

警告:在 C++11 [-Wnarrowing] 中,将 {} 内的 '(((unsigned int)test) & 255u)' 从 'unsigned int' 缩小到 'unsigned char' 的转换范围不正确 [-Wnarrowing]

对于C++11中的任何值,缩小总是不正确的吗?

有没有办法在没有显式转换的情况下保留清晰的代码,但在这种情况下不会收到警告(以及 C++11 模式下的错误)?

4

1 回答 1

2

我相信它会把它们放在一起,仍然得到一个 32 位的整数。是的,这些值在技术上适合一个字符,但它是操作输出的类型,而不是其中的数据。请注意,test 和 0xff 都是 32 位。尝试投射输出:

(unsigned char)(test & 0xff)
于 2013-10-28T11:06:59.457 回答