首先,我先自认基础概念不清,请各位仁兄看看:
我在VC++.NET中遇到的short nls;
char  a[10];nls = 0x00fa;
a[0] = (nls >> 8) & 0x00ff;
a[1] = nls & 0x00ff;结果是: a[0] = 0 , a[1] = 0nls = 0x0258;
a[0] = (nls >> 8) & 0x00ff;
a[1] = nls & 0x00ff;结果是:a[0] = 0x02 , a[1] = 0x58请问为什么?谢谢!

解决方案 »

  1.   

    当然了,0x00fa >> 8 = 0x0000
    0x0258 > 8 = 0x0002
      

  2.   

    第一问:
    nls=0x00fa=0000,0000,1111,1010
    nls>>8=0000,0000,
    那a[0],a[1]必然是0(任何数与0与都为0)第二问:
    nls=0x0258=0000,0010,0101,1000
    nls>>8=0000,0010,
    nls*0x00ff=0000,0010&0000,0000,1111,1111=0000,0010=2
    a[1]也应该是0x02,是不是写错了?
      

  3.   

    a[0] = (nls >> 8) & 0x00ff;//表示nls右移8位,结果的高8 位清0。
    a[1] = nls & 0x00ff;//表示结果的高8 位清0。nls = 0x00fa;
    右移8位是0,所以 a[0] = 0
    a[1] = 0xfa = -6  //你的结果好象错了。nls = 0x0258;
    a[0] = (nls >> 8) & 0x00ff;
    a[1] = nls & 0x00ff;a[0] = 0x02 & 0x00ff = 0x02
    a[1] = 0x0258 & 0x00ff = 0x58
      

  4.   

    nls >> 8相当于nls /256
    nls & 0x00ff相当于只要低位的值nls%256
      

  5.   

    to zhucde(【风间苍月】):你的一个星如何来的,我很奇怪
    我是nls右移8位, 不是nls >>= 8 做完操作后nls的值又没变各位注意:我想问的是为什么会有那样的结果。to snowroad(雪程):我在机器上运行结束后就是那样的结果,同时我用的VC++.net是正版的。
    有没有办法可以绕过。
      

  6.   

    to GoldWood:
    我的结果应该是对的,我也是实际运行的,不过是在VC6.0上。
    是不是整型向字符型转换时,出错了。
    a[1]是字符型的,而 nls & 0x00ff 是short型的。
    改为a[1] =(char) (nls & 0x00ff);试一下看。
      

  7.   

    既然是正版用户,联系微软啊.编译得时候不打开优化,看看debug下得结果.
      

  8.   

    楼上各位,错了!
    我用VC60。
    short nls;
    char  a[10];nls = 0x00fa;
    a[0] = (nls >> 8) & 0x00ff;
    a[1] = nls & 0x00ff;结果:a[0]=0;a[1]=0xfa;
    没有得出楼主的结果啊。
      

  9.   

    对不起,我看错了,是VC++.net,我试过了,确实出现了楼主的结果。
    我看了看汇编代码,问题出在这句:
    a[1] = nls & 0x00ff;
    00419F9E  movsx       eax,word ptr [nls] 
    00419FA2  and         eax,0FFh //此处eax==0x000000fa
    00419FA7  mov         byte ptr [ebp-1Fh],al //此处al==0x00;
    看来微软出问题了,现在低字节不在前了。
      

  10.   

    to coohai:谢谢,我已经把问题提交到微软公司了,现在还没结果
      

  11.   

    在这里这个问题只要是因为我的服务期过了,于是微软就不受理了,他才不不管是不是BUG.