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




