打印
[国产单片机]

无符号长整形数如何转换为四个无符号字符数

[复制链接]
4047|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jzhihe|  楼主 | 2011-9-23 16:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用51单片机写一个程序,将 unsigned long int转换为 四个 unsigned char,可是高16位转换总是为零。程序如下:
unsigned int page;
unsigned long int Recode;
unsigned char WRflash[20];
page=1281;
Recode=page*264;

WRflash[0]=(Recode/65536)/256;
WRflash[1]=(Recode/65536)%256;
WRflash[2]=(Recode%65536)/256;
WRflash[3]=(Recode%65536)%256;


WRflash[0],WRflash[1]总是为零,请各位技术大牛看看,哪里有问题,请多多指教。

相关帖子

沙发
chen3bing| | 2011-9-23 20:21 | 只看该作者
WRflash[0]=(uchar)(Recode>>12);
WRflash[1]=(uchar)((Recode>>8)&0x0f);

使用特权

评论回复
板凳
老鱼探戈| | 2011-9-24 10:01 | 只看该作者
用移位指令,然后强制类型转换即可。
省空间更可靠。

使用特权

评论回复
地板
Cortex-M0| | 2011-9-24 19:40 | 只看该作者
直接赋值最快~~~

unsigned int page;
unsigned long Recode;
unsigned char WRflash[20];
page=1281;
Recode=page*264;

WRflash[0]=((unsigned char *)(&Recode))[0];
WRflash[1]=((unsigned char *)(&Recode))[1];
WRflash[2]=((unsigned char *)(&Recode))[2];
WRflash[3]=((unsigned char *)(&Recode))[3];

使用特权

评论回复
5
jzhihe|  楼主 | 2011-9-26 07:43 | 只看该作者
本帖最后由 jzhihe 于 2011-9-26 08:39 编辑

2# chen3bing 大哥你这是错的,Recode是长整型 ,四个字节的。不过我想问,我那样写有什么问题,为什么转换后高位都为零了?

使用特权

评论回复
6
jzhihe|  楼主 | 2011-9-26 07:43 | 只看该作者
3# 老鱼探戈 谢谢

使用特权

评论回复
7
jzhihe|  楼主 | 2011-9-26 07:44 | 只看该作者
4# Cortex-M0 这个真没看懂,这个写的话,不是数组里的每个值都是一样的吗?

使用特权

评论回复
8
jzhihe|  楼主 | 2011-9-26 07:45 | 只看该作者
各位前辈给出了不错的意见,不过我还想知道我写的程序问题出在哪里?这个很让人费解

使用特权

评论回复
9
jzhihe|  楼主 | 2011-9-26 07:56 | 只看该作者
谢谢。原程序中的Recode的值必须由page传递,page是个全局变量,我上面page的值只是为了举例说明,我想问一下,Recode的值是不是经过page的运算后先变成了unsigned int,,赋值给Recode的时候高十六位就变成了零,因为page是unsigned int

使用特权

评论回复
10
chen3bing| | 2011-9-26 14:50 | 只看该作者
有可能。

使用特权

评论回复
11
老鱼探戈| | 2011-9-26 15:17 | 只看该作者
4# Cortex-M0 这个真没看懂,这个写的话,不是数组里的每个值都是一样的吗?
jzhihe 发表于 2011-9-26 07:44


4L使用指针的方法直接赋值。
51是8位机,unsigned char型号占用一个字节的地址空间,long 型是32位的,占用4个字节的地址空间。
这种方法是取long型变量4个地址空间中的内容直接赋值。

使用特权

评论回复
12
airwill| | 2011-9-26 15:30 | 只看该作者
有道理, 这是编译器的问题, 不如这样写试试:

Recode=(unsigned long)page*264;

使用特权

评论回复
13
jzhihe|  楼主 | 2011-9-26 17:04 | 只看该作者
11# 老鱼探戈 明白了,我是菜鸟,第一次见这样写的,谢谢啦,我明白程序问题出在哪了,因为两个数相乘,乘数是unsigned int的,相乘的结果也会变成unsigned int,最后转换成unsigned  long  int型时,高十六位全为零。

使用特权

评论回复
14
jzhihe|  楼主 | 2011-9-26 17:06 | 只看该作者
10# chen3bing 谢谢啦,我明白程序问题出在哪了,因为两个数相乘,乘数是unsigned int的,相乘的结果也会变成unsigned int,最后转换成unsigned  long  int型时,高十六位全为零。

使用特权

评论回复
15
jzhihe|  楼主 | 2011-9-26 17:07 | 只看该作者
12# airwill 谢谢啦,我明白程序问题出在哪了,因为两个数相乘,乘数是unsigned int的,相乘的结果也会变成unsigned int,最后转换成unsigned  long  int型时,高十六位全为零。这样写结果正确了

使用特权

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

本版积分规则

9

主题

25

帖子

1

粉丝