找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1607|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机进行位移运算,为什么数据会异常?

[复制链接]
回帖奖励 10 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:1043477 发表于 2022-10-13 16:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下
#include "RX8F103.h"
#include "intrins.h"
#include <stdio.h>




#define BSWAP_16(x) \
    (uint16_t)((((uint16_t)(x) & 0x00ff) << 8) | \
                  (((uint16_t)(x) & 0xff00) >> 8) \
                         )
                        
#define BSWAP_32(x) \
    (uint32_t)((((uint32_t)(x) & 0xff000000) >> 24) | \
                  (((uint32_t)(x) & 0x00ff0000) >> 8) | \
                          (((uint32_t)(x) & 0x0000ff00) << 8) | \
                          (((uint32_t)(x) & 0x000000ff) << 24) \
                         )










//从串口发送一个字符
void EUart0_SendOneChar(char c)
{
        ES0=0;                                //发送数据时关串口中断
        TI0=0;                                //清TI位
        S0BUF = c;                //将待发送字符放入串口数据缓冲寄存器,并开始传输。
        while(!TI0);        //等待传送结束。当字符发送结束后由硬件置位请求中断,
                                                                //此时while循环结束,而串口中断处理函数需等到ES重新置1后才可能响应。
        TI0=0;                                //软件清TI位,亦可在中断处理函数中清0
        ES0 = 1;                        //开串口中断
}


void EUart0_SendString(char *st)
{
        while(*st)
        {
                EUart0_SendOneChar(*st++);
        }
}


unsigned char x[50] ={0x1e,0x00,0x00,0x00,0xca,0xfb,0x5f,0xf8,0x8f,0x00,0x1a,0x00,0x02,0xcf,0x81,
                      0xdb,0xff,0xe7,0xc8,0x00,0x20,0x00,0x01,0x5e,0x46,0xf5,0x71,0xd1,0x50,0x00,
                      0x21,0x00,0x01,0xa9,0xe1,0xfc,0xdf,0xc0,0x85,0x00,0x23,0x00,0x02,0xc8,0x44,
                      0xd7,0xf5,0xe9,0x47,0x00};




void main(void)
{         long a1=8;
          long a2=0x8f;
        int a3;


  int i = 48;
  int* p = &i;
  char c = 0;


        unsigned char* iKeyP = x;
        CLKCON |= 0x1F;                                //默认所有时钟打开
        RSTPORTEN = 1;                                //使能复位功能


        UART0PORTEN = 1;                        //串口端口使能
        S0CON = 0x50;                                        //SCON: Mode 1, 8-bit UART, Enable Rcvr
        S0RELH = 0x03;                                //S0RELH + S0RELL  构成波特率设置S0REL[9:0]
        S0RELL = 0xF7;                                //Baud rate  = SYSCK/(16×(1024-S0REL))  SYSCK跟CLKDIV寄存器有关  波特率为115200
        ES0 = 1;                                                        //允许串口中断位
//        EUart0_SendString("RX8F103 IIC Slave Init! V2.0\r\n");
        printf("a1==0x%x\r\n",a1);
        a1 = ((a1) << (9));
        a2 = (a2)+(128);
        a3 = *((short*)(iKeyP + (8)));
        a3=BSWAP_16(a3);
          while(1)
        {
                printf("Hello RX8F103 UART0\r\n");
                printf("a1==0x%x\r\n",a1);
                printf("a2==0x%x\r\n",a2);
                printf("a3==0x%x\r\n",a3);
                }
}


char putchar (char c)
{
        EUart0_SendOneChar(c);
        return c;
}


第一个问题问题在于这个语句a1 = ((a1)) << (9);printf("a1==0x%x\r\n",a1);
long型数据是四位的,定义a1=8,按照二进制就是0000 0000 0000 0000 0000 0000 0000 1000
左移九位就是0000 0000 0000 0000 0001 0000 0000 0000
输出的数不应该是0x1000么,为什么输出的是0x0
第二个问题,是a2 = (a2)+(128);已经定义a2=0x8f,进行运算a2应该等于0x10f,但是打印出来是90

以下是打印结果
Hello RX8F103 UART0
a1==0x0
a2==0x90
a3==0x8f



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:526108 发表于 2022-10-13 17:31 | 只看该作者
printf("a1==0x%lx\r\n",a1);
回复

使用道具 举报

板凳
ID:1043477 发表于 2022-10-13 17:44 | 只看该作者
qq624353765 发表于 2022-10-13 17:31
printf("a1==0x%lx\r\n",a1);

好的,这样打印就对了,大佬再请教一下,现在我做加法运算为什么会出错 a2 = (a2)+(128);,之前已经读出来a2=0x8f,如果进行a2=a2+128的运算,应该是a2=0x10f,但是现在打印出来的是a2=0x90
回复

使用道具 举报

地板
ID:384109 发表于 2022-10-13 20:35 | 只看该作者
第二个问题的答案同第一个问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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