5

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

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

最后两行的结果表明括号导致

一种。实际类型转换为有符号

湾。静态分析工具认为是有符号的类型转换

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

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

4

2 回答 2

6

C 中没有做任何事情int:例如,当添加两个时unsigned chars,即使在添加之前,操作数也会int根据默认提升转换为。

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

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

于 2011-09-13T10:37:38.837 回答
3

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

于 2011-09-13T10:36:04.757 回答