CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

一个简单而又奇怪的类型转换问题,在线等待......

楼主GoldWood()2003-09-04 16:59:26 在 VC/MFC / 基础类 提问

首先,我先自认基础概念不清,请各位仁兄看看:  
  我在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

相关问题

  • 奇怪的类型转换问题
  • 数据类型转换,在线等待
  • 一个类型转换__在线等待....
  • 类型转换,非常奇怪的问题。高手进来
  • 类型转换!
  • 类型转换???
  • 类型转换????
  • 类型转换????
  • 转换类型
  • 类型转换?

关键词

  • .net
  • vc++
  • vc
  • x00
  • nls
  • ff
  • 结果
  • fa
  • 右移
  • 问题

得分解答快速导航

  • 帖主:GoldWood

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo