ANDing和比较时的符号转换

时间:2012-10-01 14:54:23

标签: c++ gcc casting unsigned-char

我有以下代码:

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导致了这个警告。两个变量都是无符号的。有什么想法吗?

3 个答案:

答案 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被提升为&。然后将intx进行比较,uint8_t仍为i + HEADER_SIZEuint8_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。