首页
学习
活动
专区
圈层
工具
发布

C位算子
EN

Stack Overflow用户
提问于 2015-03-03 14:10:58
回答 4查看 254关注 0票数 0

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

代码语言:javascript
复制
unsigned int n;
long int data;
data|=(1<<n);

问题是当n大于15时,数据的值不会改变。不过,当我尝试:

代码语言:javascript
复制
data|=(1<<16);

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-03-03 14:15:26

在您的代码中,1的类型(一如既往)是int。因此,如果sizeof (int)小于sizeof (long),那么您就不能在long中的所有位上移动int

当然,解决方案是使用一个(未签名的)长常数:

代码语言:javascript
复制
data |= 1UL << n;

我使它无符号,因为无符号整数更适合于按位运算符。文字1UL的类型是unsigned long。我发现使用后缀比使用转换更好,因为它更短,也是文字本身的一部分,而不是使用错误类型的文字并对其进行转换。

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

代码语言:javascript
复制
unsigned long long veryBig = 1 << 35; /* BAD CODE */

右侧应该神奇地适应左侧的“需求”,从而成为unsigned long long类型(我只是假设它至少有35位,这当然不是可移植的,但它很简洁)。这是不可能的,C不是那样工作的。对表达式进行计算,然后将表达式转换为左边的类型,以便分配工作。

票数 0
EN

Stack Overflow用户

发布于 2015-03-03 14:16:03

如果是sizeof(int)==2,那么1<<nint类型的。和1<<16 == 0。因此,data没有更改。

票数 0
EN

Stack Overflow用户

发布于 2015-03-03 14:16:04

可能是因为int是16位。当您使用整数字面值时,编译器可以计算出结果大于适合于int的结果,并将优化整个shift操作,但是当您使用变量时,编译器不能这样做,因为它不知道n的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28833933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档