我已经通过静态分析工具提供了以下代码:
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。静态分析工具认为是对签名的类型转换
我将询问有关(b)的静态分析工具开发人员。
但是在我这样做之前,我想知道是否已知C语言可以做到(a)?
最佳答案
在int
下面,C中什么也没做:例如,在添加两个unsigned chars
时,甚至在添加之前,操作数都会根据默认提升转换为int
。
unsigned char u1, u2, u3;
u1 = 0;
u2 = 42;
u3 = u1 + u2;
在最后一行中,首先将
u1
和u2
转换为int
,然后应用+
运算符获得int
值,然后将该值转换回unsigned char
(当然,编译器可以使用快捷方式!)关于C中的括号可以更改按位运算的操作数的结果类型吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7400258/