I have fed the following code through a static analysis tool:
u1 = (u1 ^ u2); // OK
u1 = (u1 ^ u2) & u3; // NOT OK
u1 = (u1 ^ u2) & 10; // NOT OK
u1 = (u1 ^ u2) & 10U; // NOT OK
u1 = (unsigned char)(u1 ^ u2) & 10U; // OK
u1 = (unsigned char)(u1 ^ u2) & u3; // OK
"OK" means the static analysis tool did not complain. "NOT OK" means the static analysis tool did complain -- claiming that some operand of a bitwise operation is not an unsigned integer.
The results from the last 2 lines show that the parentheses are causing either
a. an actual type conversion to signed
b. something that the static analysis tool thinks is a type conversion to signed
I will ask the static analysis tool developer about (b).
But before I do, I would like to know if perhaps the C language 开发者_JAVA百科is known to do (a)?
Nothing in C is done below int
: eg when adding two unsigned chars
, even before the addition, the operands are converted to int
according to the default promotions.
unsigned char u1, u2, u3;
u1 = 0;
u2 = 42;
u3 = u1 + u2;
In the last line, first u1
and u2
are converted to int
, then the +
operator is applied to obtain a int
value and then that value is converted back to unsigned char
(of course the compiler can use shortcuts!)
This is because, in C, the resulting type of an operation on two unsigned char
:s is int
. The static analysis tool correctly (though not very intuitive) reports that the &
is applied to an int
.
精彩评论