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)==2
则 1<<n
的类型为 int
。和 1<<16 == 0
。因此 data
没有改变。
可能是因为int
是16位。当您使用整数文字时,编译器可以计算出结果大于 int
,并且会优化整个移位操作,但是当您使用变量时,编译器不能这样做,因为它不知道 n
.
的值
谢谢大家,你们的回答让我明白了问题所在
(1<<n)
中的 1 是大小为 2 字节的整数。
我通过让 1 为 unsigned long (1UL<<n)
解决了这个问题。
这是我的第一个问题,你们很棒。
谢谢你,我很抱歉我的英语不好。
我正在使用使用 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)==2
则 1<<n
的类型为 int
。和 1<<16 == 0
。因此 data
没有改变。
可能是因为int
是16位。当您使用整数文字时,编译器可以计算出结果大于 int
,并且会优化整个移位操作,但是当您使用变量时,编译器不能这样做,因为它不知道 n
.
谢谢大家,你们的回答让我明白了问题所在
(1<<n)
中的 1 是大小为 2 字节的整数。
我通过让 1 为 unsigned long (1UL<<n)
解决了这个问题。
这是我的第一个问题,你们很棒。
谢谢你,我很抱歉我的英语不好。