一个简单而又奇怪的类型转换问题,在线等待......
首先,我先自认基础概念不清,请各位仁兄看看:
我在VC++.NET中遇到的
short nls;
char a[10];
nls = 0x00fa;
a[0] = (nls >> 8) & 0x00ff;
a[1] = nls & 0x00ff;
结果是: a[0] = 0 , a[1] = 0
nls = 0x0258;
a[0] = (nls >> 8) & 0x00ff;
a[1] = nls & 0x00ff;
结果是:a[0] = 0x02 , a[1] = 0x58
请问为什么?谢谢!
问题点数:0、回复次数:14Top
1 楼ripyu(抢分的恶狼)回复于 2003-09-04 17:10:19 得分 0
当然了,0x00fa >> 8 = 0x0000
0x0258 > 8 = 0x0002Top
2 楼zhucde(【風間苍月】★<==>★【虚拟闲人】)回复于 2003-09-04 17:16:08 得分 0
第一问:
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,是不是写错了?Top
3 楼snowroad(雪程)回复于 2003-09-04 17:18:54 得分 0
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
Top
4 楼wuchuncai(1234567)回复于 2003-09-04 17:26:15 得分 0
nls >> 8相当于nls /256
nls & 0x00ff相当于只要低位的值nls%256
Top
5 楼GoldWood()回复于 2003-09-05 08:42:48 得分 0
to zhucde(【风间苍月】):你的一个星如何来的,我很奇怪
我是nls右移8位, 不是nls >>= 8 做完操作后nls的值又没变
各位注意:我想问的是为什么会有那样的结果。
to snowroad(雪程):我在机器上运行结束后就是那样的结果,同时我用的VC++.net是正版的。
有没有办法可以绕过。
Top
6 楼GoldWood()回复于 2003-09-05 10:23:18 得分 0
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPTop
7 楼GoldWood()回复于 2003-09-05 13:06:02 得分 0
看来是微软的技术专家也解决不了的问题Top
8 楼snowroad(雪程)回复于 2003-09-09 22:13:19 得分 0
to GoldWood:
我的结果应该是对的,我也是实际运行的,不过是在VC6.0上。
是不是整型向字符型转换时,出错了。
a[1]是字符型的,而 nls & 0x00ff 是short型的。
改为a[1] =(char) (nls & 0x00ff);试一下看。
Top
9 楼harrypotter(哈里*波特)回复于 2003-09-09 23:32:48 得分 0
既然是正版用户,联系微软啊.
编译得时候不打开优化,看看debug下得结果.Top
10 楼coohai(海)回复于 2003-09-10 09:00:41 得分 0
楼上各位,错了!
我用VC60。
short nls;
char a[10];
nls = 0x00fa;
a[0] = (nls >> 8) & 0x00ff;
a[1] = nls & 0x00ff;
结果:a[0]=0;a[1]=0xfa;
没有得出楼主的结果啊。Top
11 楼coohai(海)回复于 2003-09-10 09:38:38 得分 0
对不起,我看错了,是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;
看来微软出问题了,现在低字节不在前了。
Top
12 楼GoldWood()回复于 2003-09-10 14:36:24 得分 0
to coohai:谢谢,我已经把问题提交到微软公司了,现在还没结果Top
13 楼GoldWood()回复于 2003-09-10 14:38:50 得分 0
在这里这个问题只要是因为我的服务期过了,于是微软就不受理了,他才不不管是不是BUG.Top
14 楼wuchuncai(1234567)回复于 2003-09-11 09:22:50 得分 0
微软的vc6做该题,能得到正确的结果
Top




