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输出,怎么办呢?

解决方案 »

  1.   

    long la = 0x12345678;
    char * psza = (char *)&la;在内存的的存放顺序是高位在高处,低位在低处所以位从高到低是, 12  34  56  78
    *psza = 0x78, *(psza+1) = 0x56, *(psza+2) = 0x34, *(psza+3) = 0x12intel的CPU是小端法表示数据的, 就是高位在高处,低位在低处,微机原理有讲
      

  2.   


    可以搜索
    Big endian    little endian再给个参考
    http://blog.vckbase.com/smileonce/archive/2005/02/22/3202.aspx
      

  3.   

    那么也就是说 pdw 首先得到的应该是 数组自上而下的顺序(数组应该是按0——n这样子在内存中排列的吧),因为unsigned long *pdw = (unsigned long*)&pChar[0]; 
    也就是11101010,00000011,00000000,00000000
    然后输出时倒过来是不是,那么 pdw 在赋值之后到底指向哪里?
      

  4.   

    底位存在低地址,高位存在高地址,你这个是用一个unsigned long指针指向pChar[0]的地址
      

  5.   


    那么为何 *psza = 0x78 ,还是有点不理解?
      

  6.   

    long la占4个字节,*psza = 0x78就是*(psza + 0) = 0x78,在long la的最低的地址位
      

  7.   

    但是我用VC断点调试,发现 *(psza+0) = 120;
    *(psza+1) = 86;
    *(psza+2) = 52;
    *(psza+3) = 18;看起来像是不同的组合,奇怪?
      

  8.   

    还有,数组怎么存放,是不是依据 下标 自上而下,那么既然 pdw 指向 pChar[0]的地址(调试过,事实上也这样),那么怎么会输出反了过来
      

  9.   

    不解?如果你记住,低位在低字节,高位在高字节,就会明白了,
    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在后慢慢想吧
    不知道这回讲清楚没有,不要把你弄糊涂了
      

  10.   

    Big Endian 低地址 高地址 
    -----------------------------------------> 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    | 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 | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
      

  11.   

    *(psza+0) = 120 = 0x78;
    *(psza+1) = 86 = 0x56;
    *(psza+2) = 52 = 0x34;
    *(psza+3) = 18 = 0x12;          十进制  十六进制
      

  12.   

    当场吐血,我怎么如此愚蠢
    那么还是老问题
    那么既然 pdw 指向 pChar[0]的地址(调试过,事实上也这样),那么怎么会输出反了过来?
      

  13.   


    你的意思是指为什么指向低位,却能读出那个数吧
    你的想法是指向12那里, 然后依次往下读,34 56 78,从高位读到低位吧, 不过这样的话,就是地址在减了吧,不对噢。
    12是高位地址,78是低位, 所以要读应该从78开始, 加1读到56 再加1读到34 再加1得12。太深了我可不懂 给你介绍点历史,大端法和小端法的来源是格列佛游记里面的一个打鸡蛋从大头打还是小头打的问题,X86结构的采用小端法,指向低位,反正指向低位就是能读出来,  我对其它构架的CPU不清楚,反正有大端法的CPU,不过我们一般用的是X86构架的CPU,都是小端法我的讲解不专业,仅是自已认识,口述,没有参考文献,难免错误, 如有疑问查看权威讲解。
      

  14.   

    呵呵,楼上谦虚,我刚才又对照VC的调试工具Memory,终于搞明白了,谢谢你们了!