我正在使用 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/