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

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

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”表示静态分析工具没有抱怨。 “不行”意味着静态分析工具抱怨 – 声称按位操作的某些操作数不是无符号整数。

最后两行的结果表明括号正在引起

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

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

我将向静态分析工具开发人员询问(b)。

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

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

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

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

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