C 按位运算符

标签 c bitwise-operators

我正在使用 CodeVisionAVR 评估 V2.05.0,它使用 C 编译器引用。当我尝试此代码时遇到问题:

unsigned int n;
long int data;
data|=(1<<n);

问题是当 n 大于 15 时,数据值不会改变。虽然当我尝试时:

data|=(1<<16);

结果是正确的。 如有任何帮助请。

最佳答案

在您的代码中,1 的类型(一如既往)是int。因此,如果 sizeof (int) 小于 sizeof (long),那么按理说你不能对所有 int 进行移位long 中的位。

解决方案当然是使用(无符号)长常量:

data |= 1UL << n;

我将其设置为无符号,因为无符号整数更适合按位运算符。文字 1UL 的类型是 unsigned long。我发现使用后缀比强制转换更好,因为它更短并且是文字本身的一部分,而不是使用错误类型的文字并强制转换它。

许多人似乎期望这样的表达:

unsigned long long veryBig = 1 << 35; /* BAD CODE */

右侧应该以某种方式神奇地适应左侧的“需求”,从而成为 unsigned long long 类型(我只是假设它至少有 35 位,这当然不可移植,但很简洁)。这种情况不会发生,C 不会那样工作。对表达式进行求值,然后将其转换(如果需要)为左侧的类型以使赋值生效。

关于C 按位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28833933/

相关文章:

c - 术语和代码行的平等

java - 将按位运算 (i & 1) 从 C++ 转换为 Java

c - Pcap 读取 tcp header 字段无提示地失败

c++ - 通过按位运算确定值是否包含另一个值

c - 如何在 if else 条件下创建逻辑

android - arm-gcc编译器编译的c代码的头文件

c++ - 将 unsigned char * 转换为 hexstring

Java 移位运算符

c - "int *(*pfp) ();"在 C 中做什么?

android - 从 Android 接收 C 语言服务器上的字节