C中的括号是否可以更改按位运算的操作数的结果类型?

时间:2011-09-13 10:20:59

标签: c type-conversion bitwise-operators parentheses

我通过静态分析工具提供了以下代码:

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

“确定”表示静态分析工具没有抱怨。 “不行”意味着静态分析工具确实抱怨 - 声称按位运算的某些操作数不是无符号整数。

最后两行的结果显示括号正在导致

一个。实际的类型转换为签名

湾静态分析工具认为是对签名的类型转换

我会问静态分析工具开发人员关于(b)。

但在此之前,我想知道C语言是否可以做(a)?

2 个答案:

答案 0 :(得分:6)

int之下C中没有任何内容:例如,在添加两个unsigned chars时,即使在添加之前,操作数也会根据默认促销转换为int

unsigned char u1, u2, u3;
u1 = 0;
u2 = 42;
u3 = u1 + u2;

在最后一行中,首先将u1u2转换为int,然后应用+运算符以获取int值,然后该值被转换回unsigned char(当然编译器可以使用快捷方式!)

答案 1 :(得分:3)

这是因为,在C中,两个unsigned char:s上的操作的结果类型是int。正确的静态分析工具(虽然不是很直观)报告&已应用于int