我正在使用使用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;
我将其设置为无符号,因为无符号整数更适合按位运算符。文字的类型1UL
是unsigned long
。我发现使用后缀比强制转换更好,因为后缀要短得多并且是文字本身的一部分,而不是使用错误类型的文字并将其强制转换。
许多人似乎期望这样的表达式:
unsigned long long veryBig = 1 << 35; /* BAD CODE */
右侧应该以某种方式神奇地适应左侧的“需求”,并因此成为类型unsigned long long
(我只是假定至少具有35位,这当然不是可移植的,但很简洁)。那不会发生,C不会那样工作。对表达式进行求值,然后将其转换(如有必要)为左侧的类型,以使分配生效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句