C 按位运算符

C bitwise operator

我正在使用使用 C 编译器的 CodeVisionAVR Evaluation V2.05.0 Reference.I 在尝试此代码时遇到问题:

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 */

右侧应该以某种方式神奇地适应左侧的 "needs",从而变成 unsigned long long 类型(我假设它至少有 35 位,这当然不是便携式的,但它很简洁)。那不会发生,C 不会那样工作。表达式被求值,然后它被转换(如果需要)到左边的类型以使赋值工作。

如果 sizeof(int)==21<<n 的类型为 int。和 1<<16 == 0。因此 data 没有改变。

可能是因为int是16位。当您使用整数文字时,编译器可以计算出结果大于 int,并且会优化整个移位操作,但是当您使用变量时,编译器不能这样做,因为它不知道 n.

的值

谢谢大家,你们的回答让我明白了问题所在 (1<<n) 中的 1 是大小为 2 字节的整数。 我通过让 1 为 unsigned long (1UL<<n) 解决了这个问题。 这是我的第一个问题,你们很棒。 谢谢你,我很抱歉我的英语不好。