打印
[C语言]

讨论,Keil C51字节整合为字函数

[复制链接]
2106|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SUUY79|  楼主 | 2019-2-6 23:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
mohanwei| | 2019-2-7 18:13 | 只看该作者
unsigned char UC_Buff[16];//下标0-15有效
unsigned short *pUS = (unsigned short *)UC_Buff;
然后通过pUS[i]来访问,i取值范围0-7有效

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
SUUY79 + 1 很给力!
板凳
oufuqiang| | 2019-2-7 23:57 | 只看该作者
#include <reg52.h>

unsigned char arr1[4]={0x00,0x80,0x01,0x00};
unsigned int char2int(unsigned char * srcarr,unsigned char pos)
{
        unsigned int tempvar;
        pos<<=1;
        ((unsigned char *)&tempvar)[0]=srcarr[pos];
        pos++;
        ((unsigned char *)&tempvar)[1]=srcarr[pos];
        return(tempvar);
}
void main()
{
        unsigned int t1,t2;
        while(1)
        {
                t1=char2int(arr1,0);
                t2=char2int(arr1,1);
        }
}

使用特权

评论回复
地板
oufuqiang| | 2019-2-8 17:52 | 只看该作者
其实二楼用指针就很好啊,指定数据空间类型,编译后代码很好,调用了MOV A,@R0
#include <reg52.h>
unsigned char arr1[4];
unsigned char i;
unsigned int t1;
unsigned int * c2i;
void main()
{
        arr1[0]=0x12;
        arr1[1]=0x34;
        arr1[2]=0x56;
        arr1[3]=0x78;
        c2i=((unsigned int *)arr1);
        while(1)
        {
                t1=c2i[i];
                i++;
        }
}

使用特权

评论回复
5
SUUY79|  楼主 | 2019-2-8 18:06 | 只看该作者
mohanwei 发表于 2019-2-7 18:13
unsigned char UC_Buff[16];//下标0-15有效
unsigned short *pUS = (unsigned short *)UC_Buff;
然后通过pU ...

谢谢回复,代码确实简洁好用。但是我想通过带参函数调用实现,能不能提供一个方案!谢谢

使用特权

评论回复
6
SUUY79|  楼主 | 2019-2-8 18:09 | 只看该作者

谢谢,我希望通过带参函数调用实现,不知有没有好的方法?

使用特权

评论回复
7
oufuqiang| | 2019-2-8 18:39 | 只看该作者
SUUY79 发表于 2019-2-8 18:09
谢谢,我希望通过带参函数调用实现,不知有没有好的方法?

我3楼不是贴了吗

使用特权

评论回复
8
SUUY79|  楼主 | 2019-2-8 19:02 | 只看该作者
oufuqiang 发表于 2019-2-8 17:52
其实二楼用指针就很好啊,指定数据空间类型,编译后代码很好,调用了MOV A,@R0
...

2楼的代码测试了一下确实好用,我主要对Keil c51的指针这些东西理解不够,用不好。实际上通过全局变量我知道怎么实现,但是想通过带形参的函数调用就出现问题了,比如下面的代码,就是我现在使用的一个函数,能不能帮忙改成带参调用的函数呢?
void conv()
{
        unsigned char TempChar[7];
        unsigned int  TempInt[4];

        uchar i,j;       
        for (i=0; i<7; i++)
        {
                if(i>0)       
                {
                        if(!(i%2))
                        {
                                j++;
                                TempInt[j]=(((unsigned int)Temp[i-1]<<8)|Temp);
                        }
                }
                else TempInt[j]=Temp;       
        }
}

使用特权

评论回复
9
SUUY79|  楼主 | 2019-2-8 19:03 | 只看该作者
本帖最后由 SUUY79 于 2019-2-8 19:09 编辑
oufuqiang 发表于 2019-2-8 17:52
其实二楼用指针就很好啊,指定数据空间类型,编译后代码很好,调用了MOV A,@R0
...

2楼的代码测试了一下确实好用,我主要对Keil c51的指针这些东西理解不够,用不好。实际上通过全局变量我知道怎么实现,但是想通过带形参的函数调用就出现问题了,比如下面的代码,就是我现在使用的一个函数,能不能帮忙改成带参调用的函数呢?
void conv()
{
        unsigned char TempChar[7];
        unsigned int  TempInt[4];

        unsigned char i,j;        
        for (i=0; i<7; i++)
        {
                if(i>0)        
                {
                        if(!(i%2))
                        {
                                j++;
                                TempInt[j]=(((unsigned int)Temp[i-1]<<8)|Temp);
                        }
                }
                else TempInt[j]=Temp;        
        }
}

使用特权

评论回复
10
夜云夜雨| | 2019-2-9 10:21 | 只看该作者
mohanwei 发表于 2019-2-7 18:13
unsigned char UC_Buff[16];//下标0-15有效
unsigned short *pUS = (unsigned short *)UC_Buff;
然后通过pU ...

我觉得这个是最简单的方法

使用特权

评论回复
11
linqing171| | 2019-2-10 23:24 | 只看该作者
unsigned int char2int(unsigned char * srcarr,unsigned char pos)
{
        return ((unsigned int *)srcarr)[pos];
}
还有很多种写法,拿走不谢。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
SUUY79 + 2 很给力!
12
SUUY79|  楼主 | 2019-2-11 16:39 | 只看该作者
linqing171 发表于 2019-2-10 23:24
unsigned int char2int(unsigned char * srcarr,unsigned char pos)
{
        return ((unsigned int *)sr ...

验证了一下,非常好用,因为还有问题所以谢谢先!
还想请教一下:比如
srcarr[]={0,1,2,3,4,5,6,7,8,9}
POS=0, return 0001,好理解
POS=1, return 0203,没有理解了,我的想法应该是0102才对,还是因为强制转换的原因?

这个解答完了,可以不谢

使用特权

评论回复
13
SUUY79|  楼主 | 2019-2-11 16:39 | 只看该作者
linqing171 发表于 2019-2-10 23:24
unsigned int char2int(unsigned char * srcarr,unsigned char pos)
{
        return ((unsigned int *)sr ...

验证了一下,非常好用,因为还有问题所以谢谢先!
还想请教一下:比如
srcarr[]={0,1,2,3,4,5,6,7,8,9}
POS=0, return 0001,好理解
POS=1, return 0203,没有理解了,我的想法应该是0102才对,还是因为强制转换的原因?

这个解答完了,可以不谢

使用特权

评论回复
14
linqing171| | 2019-2-12 11:56 | 只看该作者
unsigned int A[3]={0x0102,0x0304,0x0506};
unsigned int *p=A;
p[1]是0x0102,而不是0x0203;
因为p[0]占了两个字节,但是p[1]的起始位置是从第二个字节开始的,而不是从第一个字节开始。
在keil c51里面 sizeof(unsigned int)是2;
p++对应的汇编代码也是p指向的地址增加了2,而不是增加1;

使用特权

评论回复
15
ayb_ice| | 2019-2-13 08:40 | 只看该作者
int atoi(const char *nptr);

标准库函数

使用特权

评论回复
16
kingkits| | 2019-2-13 09:15 | 只看该作者
typedef union __UN_TRANS_U32_2_BYTE
{
    uint32_t data;
    uint8_t  byte[4];
} UN_TRANS_U32_2_BYTE;
UN_TRANS_U32_2_BYTE *trans_32bits_data;

uint32_t trans_byte_to_int(byte *byte_str)
{
    trans_32bits_data = (UN_TRANS_U32_2_BYTE *)byte_str;
    return  trans_32bits_data->data;
}

使用特权

评论回复
17
SUUY79|  楼主 | 2019-2-13 14:46 | 只看该作者
linqing171 发表于 2019-2-12 11:56
unsigned int A[3]={0x0102,0x0304,0x0506};
unsigned int *p=A;
p[1]是0x0102,而不是0x0203;

受教了,非常感谢。对C51和指针还需要加强!

使用特权

评论回复
18
SUUY79|  楼主 | 2019-2-13 14:47 | 只看该作者
kingkits 发表于 2019-2-13 09:15
typedef union __UN_TRANS_U32_2_BYTE
{
    uint32_t data;

这个应该是把字节整合成长整型吧

使用特权

评论回复
19
SUUY79|  楼主 | 2019-2-13 14:48 | 只看该作者
ayb_ice 发表于 2019-2-13 08:40
int atoi(const char *nptr);

标准库函数

这个标准库没有用过,要包含哪个头文件呢?

使用特权

评论回复
20
ayb_ice| | 2019-2-13 14:55 | 只看该作者
SUUY79 发表于 2019-2-13 14:48
这个标准库没有用过,要包含哪个头文件呢?

stdlib.h

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

80

帖子

1

粉丝