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

标签 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

“OK”表示静态分析工具没有报错。 “NOT OK”表示静态分析工具确实提示——声称某个按位运算的操作数不是无符号整数。

最后两行的结果表明括号导致了这两种情况

一个。实际类型转换为 signed

静态分析工具认为是对 signed 的类型转换

关于 (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中的括号可以改变按位运算的操作数的结果类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7400258/

相关文章:

c - 在 C 中使用 isdigit() 时遇到困难

清除不需要的值

c - 用于打印 size_t 值的可移植代码?

java - 如何使用按位运算符将多个整数值传递给 Java 函数?

c - 在 C 中使用位运算符获取位值

c - C中的动态类型转换

c - 如何查找父进程的所有子进程(在 C 中)

java - 缩小引用转换

c++ - float 转换为整数的行为

c - 从 SPI 寄存器读取数据并存储到数组中