开发者

Can parentheses in C change the result type of operands of a bitwise operation?

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜