unsigned char pChar[]={234,3,0,0};
unsigned long *pdw = (unsigned long*)&pChar[0];
printf("%ld\n",pdw[0]);
//
//输出是1002没问题
但是我想知道转换的过程,怎么转换的啊,如果是把每一位的二进制组合而成,是不对的,而倒过来却正好,谁能解释一下呢?
如把 234->11101010
3->00000011
0->00000000
0->00000000全部自上而下加起来变成11101010,00000011,00000000,00000000再转换成十进制,不对,
但是倒过来,变成00000000,00000000,00000011,11101010没问题,难道数据还是倒过来转换的啊//还有,我要是想把 如 long l = 1002 转换成 字符,而且一个个输出,也就是 1,0,0,2输出,怎么办呢?
unsigned long *pdw = (unsigned long*)&pChar[0];
printf("%ld\n",pdw[0]);
//
//输出是1002没问题
但是我想知道转换的过程,怎么转换的啊,如果是把每一位的二进制组合而成,是不对的,而倒过来却正好,谁能解释一下呢?
如把 234->11101010
3->00000011
0->00000000
0->00000000全部自上而下加起来变成11101010,00000011,00000000,00000000再转换成十进制,不对,
但是倒过来,变成00000000,00000000,00000011,11101010没问题,难道数据还是倒过来转换的啊//还有,我要是想把 如 long l = 1002 转换成 字符,而且一个个输出,也就是 1,0,0,2输出,怎么办呢?
char * psza = (char *)&la;在内存的的存放顺序是高位在高处,低位在低处所以位从高到低是, 12 34 56 78
*psza = 0x78, *(psza+1) = 0x56, *(psza+2) = 0x34, *(psza+3) = 0x12intel的CPU是小端法表示数据的, 就是高位在高处,低位在低处,微机原理有讲
可以搜索
Big endian little endian再给个参考
http://blog.vckbase.com/smileonce/archive/2005/02/22/3202.aspx
也就是11101010,00000011,00000000,00000000
然后输出时倒过来是不是,那么 pdw 在赋值之后到底指向哪里?
那么为何 *psza = 0x78 ,还是有点不理解?
*(psza+1) = 86;
*(psza+2) = 52;
*(psza+3) = 18;看起来像是不同的组合,奇怪?
psza<psza+1<psza+2<psza+3
小---------------------大
低字节-----------高字节
数的低位------数的高位
0x78 0x56 0x34 0x12
位权由小到大解释的有点不专业你搜索大端法,小端法就懂了
再给你个例子
打开WINDOWS的记事本
输入“abcd“
另存为的时候选“UNICODE”再用ULTRAEDIT
选择16进制编辑
将会看到 “FF FE 61 00 62 00 63 00 64 00”
FF FE有另外含义,不解释UNICODE是以两字节表示的,一部分和ASCII码值相同,所以ASCII的‘a‘是0x61
UNICODE的编码是0x0061第一个字节为0
但是61在前00在后慢慢想吧
不知道这回讲清楚没有,不要把你弄糊涂了
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Little Endian 低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//////////////////////////////////////////////////Big Endian msb lsb
---------------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Little Endian lsb msb
---------------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*(psza+1) = 86 = 0x56;
*(psza+2) = 52 = 0x34;
*(psza+3) = 18 = 0x12; 十进制 十六进制
那么还是老问题
那么既然 pdw 指向 pChar[0]的地址(调试过,事实上也这样),那么怎么会输出反了过来?
你的意思是指为什么指向低位,却能读出那个数吧
你的想法是指向12那里, 然后依次往下读,34 56 78,从高位读到低位吧, 不过这样的话,就是地址在减了吧,不对噢。
12是高位地址,78是低位, 所以要读应该从78开始, 加1读到56 再加1读到34 再加1得12。太深了我可不懂 给你介绍点历史,大端法和小端法的来源是格列佛游记里面的一个打鸡蛋从大头打还是小头打的问题,X86结构的采用小端法,指向低位,反正指向低位就是能读出来, 我对其它构架的CPU不清楚,反正有大端法的CPU,不过我们一般用的是X86构架的CPU,都是小端法我的讲解不专业,仅是自已认识,口述,没有参考文献,难免错误, 如有疑问查看权威讲解。