读书人

单片机内怎么存贮有符号长整型数据到2

发布时间: 2012-03-21 13:33:15 作者: rapoo

单片机内如何存贮有符号长整型数据到24C02里去
如题,现在常见的是将无符号数存贮起来,现在我需要的是将有符号数存贮起来,即最高位是符号位.
例于有符号整型范围是-32767到32767,我用下列代码作存贮与取数操作
char at[6];
int itest,holdvalue;
at[0]=itest/128
at[1]=itest%128;
Write24c02(at,0x04,2);
delay(100);
Read24c02(at,0x04,2);
holdvalue=at[0]*128;
holdvalue+=at[1];
注:itest是试验数 据,最终 holdvalue与itest对比
试验发现数据仅在-16383到+16383之间写入与读出是正确的,超过这个范围的都以补码表示成负值.造成写入与读出数据不一致
如16383贮存的形式为3fff,而16384出来的是:ffffc000,即1100,0000,0000,0000
前面表示符号位自动加1,变成了负数.
因为有效数字变成-16383到16383,所以不能用整形表示了,计划用长整型表示.
即4个字节表示,第一个字节的最高位表示符号.
请问众位高手如何将有符号的长整形存贮,又如何读出,使数据与存入数据一致,谢谢


[解决办法]
void long_to_charbuff(long ldata,char* pbuff)
{
pbuff[0] = (char)((ldata&0xff000000)>>24);
pbuff[1] = (char)((ldata&0x00ff0000)>>16);
pbuff[2] = (char)((ldata&0x0000ff00)>>8);
pbuff[3] = (char)((ldata&0x000000ff));
}

[解决办法]
假定你原来的有符号数是4字节,你就直接将这4字机内码(取决于机器或你自己的实现)保存到24C0x中去就行了;
读回来时,原封不变的还原回同一变量中,或其它同类型的有符号变量中去;
这就实现了原样恢复,没有任何问题,不需要特别考虑如何保存。
[解决办法]
long charbuff_to_long(char* pbuff)
{

return (pbuff[0]<<24)+(pbuff[1]<<16)+(pbuff[2]<<8)+(pbuff[3]);
}

对应1楼,用上面的就可以恢复原值了,

一个字节不可能出现ffcf值

读书人网 >C语言

热点推荐