我有以下代码:
const uint8_t HEADER_SIZE = 0x08;
std::vector<uint8_t> a, b;
uint8_t x;
/* populate 'a', 'b'. Set 'x' */
for ( uint8_t i = 0; i < HEADER_SIZE; ++i )
{
// The if statement (specifically the AND): Conversion to 'unsigned int' from 'int' may change the sign of the result [-Wsign-conversion]
if ( x != ( a[i + HEADER_SIZE] & b[i] ) )
{
/* ... */
break;
}
}
我尝试了几乎所有的东西,我似乎无法弄清楚为什么一个简单的AND导致了这个警告。两个变量都是无符号的。有什么想法吗?
答案 0 :(得分:2)
a[i + HEADER_SIZE]
和b[i]
都会被提升为int
,尽管它们都是无符号类型,但它们的类型比int
更窄。所有较窄的整数类型都被提升为int
(如果int
可以表示所提升类型的所有值)或unsigned int
用于所有内置算术运算。
将所有操作数显式转换为unsigned int
应该使警告静音:
unsigned int a_dash = a[i + HEADER_+SIZE];
unsigned int b_dash = b[i];
unsigned int x_dash = x;
if (x_dash != (a_dash & b_dash))
{ // ...
答案 1 :(得分:1)
在uint8_t
编辑之前,您的int
被提升为&
。然后将int
与x
进行比较,uint8_t
仍为i + HEADER_SIZE
。 uint8_t
也发生了同样的事情。将结果转换回x != uint8_t(a[uint8_t(i + HEADER_SIZE)] & b[i])
应该消除警告。
{{1}}
答案 2 :(得分:0)
问题在于索引,请尝试:
_a = a[i + HEADER_SIZE];
_b = b[i];
if ( x != (_a & _b) )
您会在_a = ...行上看到问题。这是因为添加i和HEADER_SIZE会导致从uint8_t升级到int。