#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字节