CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

C语言中跟可移植性有关的一个问题

楼主helpme422()2006-03-21 15:20:01 在 C/C++ / C语言 提问

已知:多字节的数据在不同机器上的字节存储顺序可能不同,如  
  unsigned   int   i   =   0x01234567; //   设sizeof(i)==4  
  在Intel机器上是这样存储的:(低地址)67   45   23   01(高地址)  
  在IBM机器上却是这样存储的:(低地址)01   23   45   67(高地址)  
   
  那么在编译器符合ANSI标准的情况下:  
  unsigned   char   *ptr   =   (unsigned   char   *)&i;  
  在各种不同的机器上ptr:  
  A:一定是指向字节01;  
  B:一定是指向字节67;  
  C:一定是指向低地址字节,字节内容依赖于机器;  
  D:一定是指向高地址字节,字节内容依赖于机器;  
  E:以上都不对  
  哪个/哪些选项是对的?  
  问题点数:90、回复次数:28Top

1 楼goodluckyxl(被人遗忘的狗)回复于 2006-03-21 15:43:24 得分 0

C   ?Top

2 楼iamcaicainiao(老菜,长征)回复于 2006-03-21 15:51:08 得分 0

不是c就是d,要不就是e。Top

3 楼iamcaicainiao(老菜,长征)回复于 2006-03-21 15:51:34 得分 0

还有可能就是a和b。Top

4 楼gogowhy(123)回复于 2006-03-21 15:56:32 得分 0

猜测是   D  
   
  C似乎是不正确的  
  Top

5 楼gogowhy(123)回复于 2006-03-21 15:58:21 得分 0

gogowhy(123)   (   )   信誉:100     2006-03-21   15:56:00     得分:   0      
     
     
        猜测是   D  
   
  C似乎是不正确的  
   
       
    看错,刚才是相反。呵呵  
   
  Top

6 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2006-03-21 15:59:54 得分 0

cTop

7 楼helpme422()回复于 2006-03-21 16:04:33 得分 0

最好说说是否有标准的规定,因为没有规定,可能在多数机器上没问题,但在某些特定机器上程序会失败Top

8 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2006-03-21 16:17:15 得分 20

C的标准并没有对对象的内存映象应该如何排列作出规定。这也不是C标准这种高级语言的标准所应该做的事情。Top

9 楼zez(思恩 闭关练功ing...)回复于 2006-03-21 16:22:59 得分 20

C:一定是指向低地址字节,字节内容依赖于机器;  
   
  这也是用来判断一个机器的大小端的方法!!  
   
  Top

10 楼jixingzhong(瞌睡虫·星辰)回复于 2006-03-21 16:25:36 得分 0

C:一定是指向低地址字节,字节内容依赖于机器;Top

11 楼helpme422()回复于 2006-03-21 16:36:50 得分 0

megaboy(飞天御剑流之杀神一刀斩)   (   )   信誉:98     2006-03-21   16:17:00     得分:   0      
     
     
        C的标准并没有对对象的内存映象应该如何排列作出规定。这也不是C标准这种高级语言的标准所应该做的事情。  
       
     
  那么指针指向的字节位置呢?  
   
  其实我主要是担心下面程序的可移植性:  
  //   按序读取无符号整数ui的各字节到bytes数组中  
  void   ReadIntByte(   unsigned   char   *bytes,   unsigned   int   ui   )  
  {  
          unsigned   char   *ptr   =   (unsigned   char   *)&ui;  
          int   i;  
          for(   i=0;   i<sizeof(unsigned   int);   ++i   )  
                  *bytes++   =   *ptr++;  
          return;  
  }  
   
  如果ptr初始化后不一定是指向ui的最低字节的话,上面的程序就有问题了Top

12 楼Gemini2003(子由Pop)回复于 2006-03-21 17:16:19 得分 0

C:一定是指向低地址字节,字节内容依赖于机器;  
  Top

13 楼dzy1982(dislike programming!(神经病帮副帮主))回复于 2006-03-21 18:13:49 得分 0

C:一定是指向低地址字节,字节内容依赖于机器;Top

14 楼blh(当你不割肉时,你的损失只是个数字,当你割肉时,你的损失就是你的肉)回复于 2006-03-21 18:22:22 得分 0

cTop

15 楼hot225dog(无忌孩儿)回复于 2006-03-21 20:30:14 得分 0

存放顺序机器决定的,这个标准也不好规定.  
  如果ui可以的话:  
  struct   {  
  unsigned   int   ui_1:8;  
  unsigned   int   ui_2:8;  
  unsigned   int   ui_3:8;  
  unsigned   int   ui_4:8;  
  }   ui;  
  ui.ui_1=0x67;  
  ui.ui_2=0x45;  
  ui.ui_3=0x23;  
  ui.ui_4=0x01;  
  然后按序读取无符号整数ui的各字节到bytes数组中Top

16 楼digifish(df)回复于 2006-03-21 21:24:34 得分 0

CTop

17 楼Hellohuan(java 好不好???)回复于 2006-03-21 21:39:30 得分 0

upTop

18 楼cuibo1123(月满C楼)回复于 2006-03-21 22:06:10 得分 0

最好拿个机器实验一下!     我也想知道结果!Top

19 楼alexandercer(alexandercer)回复于 2006-03-22 08:01:18 得分 0

C  
  至少我觉得是这样的  
  对于相同的编译器上,不同的cpu是通过对不同的汇编语言的支持以达到对高级语言的无缝支持的,所以,你可以看看机器的汇编代码,确定一下。Top

20 楼firetoucher(风焱)回复于 2006-03-22 10:43:20 得分 10

如果编译器/环境支持的话,你需要的应该是这两个函数:  
  htons和ntohs  
  在网络字节流和int之间转换。  
  参见UNIX手册  
   
   
  FT  
  --  
  Anything   one   man   can   imagine,   other   men   can   make   real.Top

21 楼expert2000(ZLX)回复于 2006-03-22 10:54:00 得分 10

nobody   select   e   ?Top

22 楼Jiana(Robin.English)回复于 2006-03-22 11:18:56 得分 0

32位机     指针都是32位,4字节的吧Top

23 楼xubai(笑在风雨中)回复于 2006-03-22 11:28:46 得分 0

只要不通过网络传输就不影响,只要在不同网络间传输才会造成由于字节顺序不同出现问题Top

24 楼yangming0423(Stevens)回复于 2006-03-22 14:25:47 得分 0

CTop

25 楼Jedimaster(CRH = 耻辱号)回复于 2006-03-22 14:28:32 得分 0

C吧  
  无论怎么样都是要保证输出是0x01234567  
  所以指针应该是低地址8Top

26 楼helpme422()回复于 2006-03-22 14:32:15 得分 0

我想大家没有搞懂我的意思  
  我不关心对象的内存映象排列顺序,我已经举了两个相反的例子了  
  我关心的是在标准中,象(unsigned   char   *)&ui这种经过强制类型转换后的指针是不是一定指着ui的最低字节?  
  =================================  
  to:hot225dog(无忌孩儿)  
  你的位段不能解决问题,因为位段正是有可移植问题的  
  ============================  
  to:alexandercer(alexandercer)  
  我想摆脱的正是机器相关性,你却要我去看汇编……  
  ===========================  
  to:firetoucher(风焱)  
  htons和ntohs是UNIX环境中才有的函数吗  
  我不想只能在UNIX中编译  
  =============================  
  to:xubai(笑在风雨中)  
  不是因为网络间传输导致的字节顺序问题  
  是处理字节流的一个算法描述涉及到字节顺序问题Top

27 楼helpme422()回复于 2006-03-23 13:39:40 得分 0

大家也可以看看我的这个问题:  
  指针的强制类型转换是否导致潜在的问题?  
  http://community.csdn.net/Expert/TopicView.asp?id=4634475  
  本质上是一样的Top

28 楼jiangjundu(将军肚卸顶没文化穷)回复于 2006-03-28 14:12:50 得分 30

语言标准是一个和机器实现不在同一层面的东西,肯定不会对怎么用机器实现数的存储作出任何规定Top

相关问题

  • 为什么说C程序的可移植性很好?
  • 如何学好标准C++,如何才能有高度的可移植性?
  • C标准库与WIN API的优劣差异何在?C跨平台的可移植性如何?
  • 怎么提高可移植性
  • 关于程序可移植性的问题:(谢谢)
  • 编程的疑问?可移植性和快捷性,取谁?
  • 在线等,如何提高asp的可移植性问题??
  • 大家好,关于JAVA的可移植性和夸平台的问题?
  • 有关c语言指针的问题
  • 有关C语言的小问题

关键词

  • 语言
  • 内容
  • 机器
  • 指向
  • 标准
  • 低地址
  • 内容依赖于
  • 规定
  • 应该
  • unsigned char

得分解答快速导航

  • 帖主:helpme422
  • megaboy
  • zez
  • firetoucher
  • expert2000
  • jiangjundu

相关链接

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

广告也精彩

反馈

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