C按位运算符

穆罕默德·奥特曼

我正在使用使用C编译器参考的CodeVisionAVR评估版V2.05.0。尝试以下代码时遇到问题:

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

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

data|=(1<<16);

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

放松

在您的代码中,类型1为(一如既往)int因此,如果sizeof (int)小于sizeof (long),则有理由认为您不能将int移至a中的所有位long

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

data |= 1UL << n;

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章