4243|16

169

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于stc内部EEPORM存long型数的问题 [复制链接]

我想问一下,我得到了一个long型数(32位),例如它等于3652,这个数是十进制的,不是二进制的。又因为数据存到EEPROM一次只能存8位,那么我需要8位8位的传,最后要从EEPROM中取出该数时,又8位8位的移回来,我在想这些移位都是二进制的数,而我long型数是十进制的,我最后从我原先存的地址里取出来的,是十进制的数还是二进制的数?,谢谢
此帖出自51单片机论坛

最新回复

char是带符号数,如果是符号数就不可以这么做,比如-1的char是0xff,如果转换成无符号long为0x000000ff. 有符号数转换的时候直接扩展符号位到高位就可以,-1即0xff,转换成16位的有符号数是0xffff,将所有高位用符号位填充.   详情 回复 发表于 2015-5-1 18:32
点赞 关注
 

回复
举报

6366

帖子

4917

TA的资源

版主

沙发
 
单片机处理数据一般都是按照二进制处理,
你这种情况一般用数组或指针来处理。你存进去的时候,是按照从低位到高位还是按照从高位到低位,然后取出来的时候,同样也是高位在前还是低位在前。

可以先做个试验,把你的长整型数据转换成长度是4的数组,然后存到EEPROM,然后读出来的时候,也先放到一个长度是4的数组里,再转换成长整形,看看每一步处理完后的数据变化情况
此帖出自51单片机论坛

点评

我的long型数据是9000、19000时,将long型数变为char后再变long时,数据没变。而当我的long型数据是60000、50000时分别对应++-*和++-* 。我不知道这错在哪了  详情 回复 发表于 2015-4-4 10:39
这是我的long到char。和char到long的转换函数,你看行不行,其中temp1,temp2,temp3,temp4是全局变量,谢谢 void xs32_8(long a) { temp1=(a>>24)&0xff; temp2=(a>>16)&0xff; temp3=(a>>8)&0xff; temp4=a&  详情 回复 发表于 2015-4-4 10:13
好的,我先这样试试  详情 回复 发表于 2015-4-4 10:06
 
 
 

回复

169

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
tiankai001 发表于 2015-4-4 08:02
单片机处理数据一般都是按照二进制处理,
你这种情况一般用数组或指针来处理。你存进去的时候,是按照从低位到高位还是按照从高位到低位,然后取出来的时候,同样也是高位在前还是低位在前。

可以先做个试验,把你的长整型数据转换成长度是4的数组,然后存到EEPROM,然后读出来的时候,也先放到一个长度是4的数组里,再转换成长整形,看看每一步处理完后的数据变化情况

好的,我先这样试试
此帖出自51单片机论坛
 
 
 

回复

169

帖子

0

TA的资源

一粒金砂(中级)

4
 
tiankai001 发表于 2015-4-4 08:02
单片机处理数据一般都是按照二进制处理,
你这种情况一般用数组或指针来处理。你存进去的时候,是按照从低位到高位还是按照从高位到低位,然后取出来的时候,同样也是高位在前还是低位在前。

可以先做个试验,把你的长整型数据转换成长度是4的数组,然后存到EEPROM,然后读出来的时候,也先放到一个长度是4的数组里,再转换成长整形,看看每一步处理完后的数据变化情况

这是我的long到char。和char到long的转换函数,你看行不行,其中temp1,temp2,temp3,temp4是全局变量,谢谢
void xs32_8(long a)
{
temp1=(a>>24)&0xff;
temp2=(a>>16)&0xff;
temp3=(a>>8)&0xff;
temp4=a&0xff;
}


long xs8_32()
{ long a;
a = ((long)(temp1)<<24)|((long)(temp2)<<16)|((long)(temp3)<<8)|temp4;
return a;
}

此帖出自51单片机论坛
 
 
 

回复

169

帖子

0

TA的资源

一粒金砂(中级)

5
 
tiankai001 发表于 2015-4-4 08:02
单片机处理数据一般都是按照二进制处理,
你这种情况一般用数组或指针来处理。你存进去的时候,是按照从低位到高位还是按照从高位到低位,然后取出来的时候,同样也是高位在前还是低位在前。

可以先做个试验,把你的长整型数据转换成长度是4的数组,然后存到EEPROM,然后读出来的时候,也先放到一个长度是4的数组里,再转换成长整形,看看每一步处理完后的数据变化情况

我的long型数据是9000、19000时,将long型数变为char后再变long时,数据没变。而当我的long型数据是60000、50000时分别对应++-*和++-*       。我不知道这错在哪了
此帖出自51单片机论坛

点评

假设你的char是有符号的,那么就会出问题,通过转换为long,那么就不是一个字节了,可能会把符号位扩展到高三个字节。 你可以把char明确定义为unsigned char 试试  详情 回复 发表于 2015-4-4 11:09
 
 
 

回复

6040

帖子

202

TA的资源

版主

6
 
huangweichi123 发表于 2015-4-4 10:39
我的long型数据是9000、19000时,将long型数变为char后再变long时,数据没变。而当我的long型数据是60000、50000时分别对应++-*和++-*       。我不知道这错在哪了

假设你的char是有符号的,那么就会出问题,通过转换为long,那么就不是一个字节了,可能会把符号位扩展到高三个字节。
你可以把char明确定义为unsigned char 试试


此帖出自51单片机论坛

点评

我虽然定义的是char型,但是我的数据一直是正的  详情 回复 发表于 2015-5-1 00:23
你好,我最近在回顾我做的东西,但是对于你说的我还有一点疑问。为什么char型数将符号位扩展到高三位就不行呢,因为我的数据是正的,我不去管数据的符号位是什么应该都没问题啊。我不是很懂,希望你能解答一下,谢谢  详情 回复 发表于 2015-5-1 00:19
哎,,,,还是不行,不知道怎么了  详情 回复 发表于 2015-4-4 23:05
非常感谢吧,我我试试啊  详情 回复 发表于 2015-4-4 16:40
 
 
 

回复

6366

帖子

4917

TA的资源

版主

7
 
恩,6楼说的对,要注意数据的符号,是无符号还是有符号,例如对于char,范围是-127-128,而unsigned char 范围是0-255
此帖出自51单片机论坛
 
 
 

回复

169

帖子

0

TA的资源

一粒金砂(中级)

8
 


非常感谢吧,我我试试啊
此帖出自51单片机论坛
 
 
 

回复

169

帖子

0

TA的资源

一粒金砂(中级)

9
 
lcofjp 发表于 2015-4-4 11:09
假设你的char是有符号的,那么就会出问题,通过转换为long,那么就不是一个字节了,可能会把符号位扩展到高三个字节。
你可以把char明确定义为unsigned char 试试

哎,,,,还是不行,不知道怎么了
此帖出自51单片机论坛

点评

最好把调试的过程截图发出来,这样别人才能看到问题所在。 例如你传的什么值,变量里是什么值,尤其是不是你期待的结果。  详情 回复 发表于 2015-4-5 09:03
 
 
 

回复

6040

帖子

202

TA的资源

版主

10
 
huangweichi123 发表于 2015-4-4 23:05
哎,,,,还是不行,不知道怎么了

最好把调试的过程截图发出来,这样别人才能看到问题所在。
例如你传的什么值,变量里是什么值,尤其是不是你期待的结果。


此帖出自51单片机论坛

点评

你好,这个存储我终于做出来了,原来要先擦除整个扇区,然后才能写,我一开始认为擦除整个扇区不好,然后就没擦除而是直接写,最后就一直做不出来,我今天无意中想看看有没有方法,使得只擦除一个字节而不是一个扇区  详情 回复 发表于 2015-4-5 23:48
好的,我这几天要回家,等一段时间我把我的截图发过来啊,到时还请指点一下啊,谢谢  详情 回复 发表于 2015-4-5 09:29
 
 
 

回复

169

帖子

0

TA的资源

一粒金砂(中级)

11
 
lcofjp 发表于 2015-4-5 09:03
最好把调试的过程截图发出来,这样别人才能看到问题所在。
例如你传的什么值,变量里是什么值,尤其是不是你期待的结果。

好的,我这几天要回家,等一段时间我把我的截图发过来啊,到时还请指点一下啊,谢谢
此帖出自51单片机论坛
 
 
 

回复

169

帖子

0

TA的资源

一粒金砂(中级)

12
 
lcofjp 发表于 2015-4-5 09:03
最好把调试的过程截图发出来,这样别人才能看到问题所在。
例如你传的什么值,变量里是什么值,尤其是不是你期待的结果。

你好,这个存储我终于做出来了,原来要先擦除整个扇区,然后才能写,我一开始认为擦除整个扇区不好,然后就没擦除而是直接写,最后就一直做不出来,我今天无意中想看看有没有方法,使得只擦除一个字节而不是一个扇区,我无意中就发现原来stc内部的是flash,要先擦才能写,今天晚上回来加了个擦除就做出来了,stc真坑
此帖出自51单片机论坛
 
 
 

回复

169

帖子

0

TA的资源

一粒金砂(中级)

13
 
lcofjp 发表于 2015-4-4 11:09
假设你的char是有符号的,那么就会出问题,通过转换为long,那么就不是一个字节了,可能会把符号位扩展到高三个字节。
你可以把char明确定义为unsigned char 试试

你好,我最近在回顾我做的东西,但是对于你说的我还有一点疑问。为什么char型数将符号位扩展到高三位就不行呢,因为我的数据是正的,我不去管数据的符号位是什么应该都没问题啊。我不是很懂,希望你能解答一下,谢谢!
此帖出自51单片机论坛
 
 
 

回复

169

帖子

0

TA的资源

一粒金砂(中级)

14
 
lcofjp 发表于 2015-4-4 11:09
假设你的char是有符号的,那么就会出问题,通过转换为long,那么就不是一个字节了,可能会把符号位扩展到高三个字节。
你可以把char明确定义为unsigned char 试试

我虽然定义的是char型,但是我的数据一直是正的
此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

15
 
long var32;unsigned char var8;
long类型变u8类型,不需要移位
var8=(unsigned char)var32;

u8 var8array[4];long var32;
u8变long也不需要移位
var32=*(long *)(var8array);
此帖出自51单片机论坛

点评

好的,请问为什么要定义为unsigned char而不是char型 啊,这有什么要求吗  详情 回复 发表于 2015-5-1 09:14
 
 
 

回复

169

帖子

0

TA的资源

一粒金砂(中级)

16
 
huo_hu 发表于 2015-5-1 01:22
long var32;unsigned char var8;
long类型变u8类型,不需要移位
var8=(unsigned char)var32;

u8 var8array[4];long var32;
u8变long也不需要移位
var32=*(long *)(var8array);

好的,请问为什么要定义为unsigned char而不是char型 啊,这有什么要求吗
此帖出自51单片机论坛

点评

char是带符号数,如果是符号数就不可以这么做,比如-1的char是0xff,如果转换成无符号long为0x000000ff. 有符号数转换的时候直接扩展符号位到高位就可以,-1即0xff,转换成16位的有符号数是0xffff,将所有高位用符号位填  详情 回复 发表于 2015-5-1 18:32
 
 
 

回复

4008

帖子

0

TA的资源

版主

17
 
huangweichi123 发表于 2015-5-1 09:14
好的,请问为什么要定义为unsigned char而不是char型 啊,这有什么要求吗

char是带符号数,如果是符号数就不可以这么做,比如-1的char是0xff,如果转换成无符号long为0x000000ff.
有符号数转换的时候直接扩展符号位到高位就可以,-1即0xff,转换成16位的有符号数是0xffff,将所有高位用符号位填充.
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表