我正在使用使用C编译器参考的CodeVisionAVR评估V2.05.0。当我尝试以下代码时遇到了一个问题:
unsigned int n;
long int data;
data|=(1<<n);问题是当n大于15时,数据的值不会改变。不过,当我尝试:
data|=(1<<16);结果是正确的。任何求助请求。
发布于 2015-03-03 14:15:26
在您的代码中,1的类型(一如既往)是int。因此,如果sizeof (int)小于sizeof (long),那么您就不能在long中的所有位上移动int。
当然,解决方案是使用一个(未签名的)长常数:
data |= 1UL << n;我使它无符号,因为无符号整数更适合于按位运算符。文字1UL的类型是unsigned long。我发现使用后缀比使用转换更好,因为它更短,也是文字本身的一部分,而不是使用错误类型的文字并对其进行转换。
许多人似乎期望在这样的表达中:
unsigned long long veryBig = 1 << 35; /* BAD CODE */右侧应该神奇地适应左侧的“需求”,从而成为unsigned long long类型(我只是假设它至少有35位,这当然不是可移植的,但它很简洁)。这是不可能的,C不是那样工作的。对表达式进行计算,然后将表达式转换为左边的类型,以便分配工作。
发布于 2015-03-03 14:16:03
如果是sizeof(int)==2,那么1<<n是int类型的。和1<<16 == 0。因此,data没有更改。
发布于 2015-03-03 14:16:04
可能是因为int是16位。当您使用整数字面值时,编译器可以计算出结果大于适合于int的结果,并将优化整个shift操作,但是当您使用变量时,编译器不能这样做,因为它不知道n的值。
https://stackoverflow.com/questions/28833933
复制相似问题