CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
(图)邪恶的韩国UMPC 使用 Java 编写数据库应用新规范
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

关于类型转换的一个问题

楼主xelent(前途无量or前途无亮??)2006-12-01 00:48:04 在 C/C++ / C语言 提问

char   m;  
  int     n  
   
   
  m   =   (char)n  
  和  
  m   =   n   &   0xff;  
  等效吗?  
   
  我觉得和字节序有关. 问题点数:5、回复次数:9Top

1 楼jackexu()回复于 2006-12-01 08:29:39 得分 1

等效Top

2 楼main25()回复于 2006-12-01 08:48:33 得分 0

是等效的啊!Top

3 楼my_web(交流qq:517664276)回复于 2006-12-01 09:36:30 得分 0

原理不一样,结果一样,你想问什么?Top

4 楼augustusqing(喜欢雨路的火焰狼)回复于 2006-12-01 09:45:14 得分 0

m   =   n&0xff     ,编译器会来一步   m   =   (char)(n&0xff),是吧。Top

5 楼lockhall(唐朝 为了猥琐而努力学习)回复于 2006-12-02 09:49:31 得分 0

yes.等效  
   
  在很多情况下,用这种&来操作还是很多的Top

6 楼xddzccn(一个人旅行)回复于 2006-12-02 10:27:50 得分 0

main()  
  {  
  char   test_1;  
   
  char   test_2;  
   
  int     n=0x5689;  
   
   
  test_1   =   (char)n;  
   
  test_2   =   n   &   0xff;  
   
  printf("test_1=%x\n",test_1);  
   
  printf("test_2=%x\n",test_2);  
   
   
  }  
  是一样的输出ffffff89  
  main()  
  {  
  unsigned   char   test_1;  
   
  unsigned   char   test_2;  
   
  unsigned   int     n=0x5689;  
   
  test_1   =   (char)n;  
   
  test_2   =   n   &   0xff;  
   
  printf("test_1=%x\n",test_1);  
   
  printf("test_2=%x\n",test_2);  
   
   
  }  
  这样就输出89  
  为什么,还要请教一下高手阿  
  Top

7 楼studying(学到老)回复于 2006-12-02 10:54:25 得分 4

在VC8的debug模式下编译的汇编代码如下:  
  m1   =   (char)n;  
  00411385     mov                   al,byte   ptr   [n]    
  00411388     mov                   byte   ptr   [m1],al    
  m2   =   n   &   0xff;  
  0041138B     mov                   eax,dword   ptr   [n]    
  0041138E     and                   eax,0FFh    
  00411393     mov                   byte   ptr   [m2],al  
   
  byte   ptr   [n]就是取n的最低位的byte,和and     eax,0FFh没有什么区别。  
  对于你说的字节顺序,虽然每个平台会有有所区别,但是平台自己会正确的处理的,不需要担心  
   
  对于为什么输出ffffff89和89,这时因为在第一个main中你定义的test1和test2为有符号的char,在转换成%x的时候会有一个符号扩展的问题,又因为此时test1的值为89,首位为1,所以符号扩展的结果就是ffffff89;如果test1的值为79,那么输出的就是79了,而不是ffffff79。而第二个main定义的是无符号的char,不会进行符号的扩展,所以就是89了。Top

8 楼zhangrui23733()回复于 2006-12-02 14:55:33 得分 0

将int强转成char可能会引起问题的.  
  强转要小心Top

9 楼sevenzeal(I`m Pointer .Pointer is heart.So S=NULL)回复于 2006-12-02 18:43:07 得分 0

学习了Top

相关问题

关键词

得分解答快速导航

  • 帖主:xelent
  • jackexu
  • studying

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

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