long/int型数据存储在字符数组中方法

本文详细介绍了C++中使用memcpy函数进行内存拷贝的方法,以及通过位移和强制转换实现长整型数据到字符数组的高效转换。同时,通过实例展示了将char数组还原为long类型数据的过程,并对比了不同转换方法的效果。文章还提到了与库函数itoa、atoi、ltoa、atol等的区别,以及不同系统下long和int的字节大小差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<stdlib.h>
using namespace std;
//原理:  使用库函数,拷贝内存; 
void method1()
{
    long a=134242304;
    char s[4]={0};
    memcpy(s,&a,sizeof(long));//
    printf("%x %x %x %x\n",s[0],s[1],s[2],s[3]);
}

/*原理:移位,强制转换*/
void method2()
{
     long a=134242304;
     char s[4];
     s[0]=(char)a;
     s[1]=(char)(a>>8);
     s[2]=(char)(a>>16);
     s[3]=(char)(a>>24);
     printf("%x %x %x %x\n",s[0],s[1],s[2],s[3]);
}
 
/*原理:  取a的地址,强制转化为char*,(指针占一个字节,正好四个字节),然后解引用取值并赋给s[i];*/  
void method3()
{
     long a=134242304;
     char s[4]; 
     for(int i = 0;i<4;i++)  
     {  
        s[i] = *((char*)&a+i);  
     }
     printf("%x %x %x %x\n",s[0],s[1],s[2],s[3]);  
}

//把uchar中的数据还原成long 
void rmethod()
{
unsigned char ch[4]={0x00,0x60,0x00,0x08};
unsigned long length=0;
//以下操作完成char型数组到long型的转换
//第一种方法
length=(unsigned long)ch[0] | (unsigned long)ch[1]<<8 | (unsigned long)ch[2]<<16 | (unsigned long)ch[3]<<24;
cout<<length<<endl;
}

//注意与函数 itoa\atoi\ltoa\atol区分,这些函数是把 123变成"123",或者相反。  
void ft()
{
int number = 134242304;
char st[25];
itoa(number, st, 10); //按十进制转换
ltoa(number, st, 10);
printf("integer = %d st = %s\n", number, st);
printf("%x %x %x %x\n",st[0],st[1],st[2],st[3]);
itoa(number, st, 16); //按16进制转换
printf("integer = %d st = %s\n", number, st);
printf("%x %x %x %x\n",st[0],st[1],st[2],st[3]);
}

int main()
{
  method1();
  method2();
  method3();
  rmethod();
  ft();
  getchar();    
}

结果:

上面的三种方法效果是一样的。

注意区分与库函数itoa、atoi、ltoa、atol等的区别。

16位系统:long是4字节,int是2字节
32位系统:long是4字节,int是4字节
64位系统:long是8字节,int是4字节

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值