1

我有以下代码:

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 会导致此警告。两个变量都是无符号的。有任何想法吗?

4

3 回答 3

2

两者a[i + HEADER_SIZE]b[i]都将被提升为intas,尽管它们都是无符号类型,但它们是比 更窄的类型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))
{ // ...
于 2012-10-01T15:02:56.330 回答
1

你的 '在被一起编辑之前uint8_t得到提升。然后就是被比较,仍然是。同样的事情发生在. 将结果转换回应该消除警告。int&intxuint8_ti + HEADER_SIZEuint8_t

x != uint8_t(a[uint8_t(i + HEADER_SIZE)] & b[i])
于 2012-10-01T15:02:13.067 回答
0

问题在于索引,请尝试:

_a = a[i + HEADER_SIZE];
_b = b[i];
if ( x != (_a & _b) )

您会看到问题出在 _a = ... 行上。这是因为 i 和 HEADER_SIZE 的添加导致了从 uint8_t 到 int 的提升。

于 2012-10-01T14:59:55.277 回答