首先,我先自认基础概念不清,请各位仁兄看看:
我在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请问为什么?谢谢!
我在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请问为什么?谢谢!
0x0258 > 8 = 0x0002
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,是不是写错了?
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
nls & 0x00ff相当于只要低位的值nls%256
我是nls右移8位, 不是nls >>= 8 做完操作后nls的值又没变各位注意:我想问的是为什么会有那样的结果。to snowroad(雪程):我在机器上运行结束后就是那样的结果,同时我用的VC++.net是正版的。
有没有办法可以绕过。
我的结果应该是对的,我也是实际运行的,不过是在VC6.0上。
是不是整型向字符型转换时,出错了。
a[1]是字符型的,而 nls & 0x00ff 是short型的。
改为a[1] =(char) (nls & 0x00ff);试一下看。
我用VC60。
short nls;
char a[10];nls = 0x00fa;
a[0] = (nls >> 8) & 0x00ff;
a[1] = nls & 0x00ff;结果:a[0]=0;a[1]=0xfa;
没有得出楼主的结果啊。
我看了看汇编代码,问题出在这句:
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;
看来微软出问题了,现在低字节不在前了。