找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1569|回复: 9
收起左侧

关于C51单片机的位操作的问题

[复制链接]
ID:69038 发表于 2022-12-7 09:42 | 显示全部楼层 |阅读模式
////16位:
  int  j ;
while (i<16)
   {
    j=1<<i;
    i++;
  }
//这个操作正常,j从位0到位15,依次变为1;

  long  j ;
while (i<32)
   {
    j=1<<i;
    i++;
  }
//这个操作就不对,i=15之后,j全是错的;


咋整?

如果要操作64位呢?该如何定义一个64位(48位)的变量?




回复

使用道具 举报

ID:258566 发表于 2022-12-7 18:25 | 显示全部楼层
#include <REG52.H>

void main()
{ unsigned long  j ;
        unsigned char i;
while (i<32)
   {
    j=(unsigned long)1<<i;
    i++;
  }
while(1);

}
常数的默认类型,指定一下,就可以了。
回复

使用道具 举报

ID:1056354 发表于 2022-12-7 23:10 | 显示全部楼层
#include <REG52.H>

void main()
{ unsigned long  j ;
        unsigned char i;
while (i<32)
   {
    j=(unsigned long)1<<i;
    i++;
  }
while(1);

}
常数的默认类型,指定一下,就可以了。
回复

使用道具 举报

ID:123289 发表于 2022-12-8 10:19 | 显示全部楼层
要保证被移位的对相,有足够的位数给你移动,才是合理的。
回复

使用道具 举报

ID:77589 发表于 2022-12-8 10:43 | 显示全部楼层
本帖最后由 Longan.Wang 于 2022-12-8 11:01 编辑

你那个第一次循环,左移一位,第二次循环,左移二位,,第三次循环,左移三位......
你觉得最后一其左移了多少位???????(1 + 2 + 3 + ...... + n)
这样写才对:
int i = 0;
int j = 1 ;
while (i<16) {
    j <<= 1;      // 每次只左移一位
    i++;
}
// 到此一共左移16位
同样
int i = 0;
long  j  = 1;
while (i<32) {
    j <<= 1;      // 每次只左移一位
    i++;
}
// 到此一共左移32位
回复

使用道具 举报

ID:69038 发表于 2022-12-8 10:46 | 显示全部楼层

真的哎~~
那64位变量又如何定义、操作呢?
回复

使用道具 举报

ID:1034262 发表于 2022-12-8 11:54 | 显示全部楼层
首先,C51不支持64位的变量。
其次,你移位32位的,却使用16位的变量,所以超过15位就会出错。改成下面的就不会错。
提醒一下,一般用于移位操作的话,最好使用无符号变量。
unsigned long  j ;
unsigned char i;
while (i<32)
   {
        j = (unsgned long)1 << i;
        i++;
  }
回复

使用道具 举报

ID:69038 发表于 2022-12-8 13:13 | 显示全部楼层
Longan.Wang 发表于 2022-12-8 10:43
你那个第一次循环,左移一位,第二次循环,左移二位,,第三次循环,左移三位......
你觉得最后一其左移了 ...

这个不是移位,是直接赋值。
j=1<<i;//把变量“j”的第“i”位设置为1。


     
回复

使用道具 举报

ID:883242 发表于 2022-12-9 18:47 | 显示全部楼层
很简单的问题,C语言里面常量默认是int类型的,C51的int是16位,1是常量,移位到16次就错了,解决方案板凳发言是对的,把常量类型强制转换就行了。
回复

使用道具 举报

ID:939553 发表于 2022-12-10 12:30 | 显示全部楼层
j=1ul<<i;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表