[讨论] C语言降龙十八掌——第四掌 吃鸡蛋应该打碎哪头?

richiefang   2009-11-21 09:59 楼主
这是一个纯粹的工程问题。教科书上没有讲,如同吃鸡蛋先打碎哪头一样,学校是不会教的。

有这样一个联合体数据结构:
typedef unsigned long uint32;
typedef unsigned short uint16;
typedef unsigned char uint8;

typedef union foo_u_ {
    uint32 member1;
    uint16 member2[2];
    uint8 member3[4];
} foo_u;

那么,当这个联合体中,member1的值为0x12345678的时候,member2[0]和member3[0]各为多少呢?

回复评论 (57)

大小端模式,在嵌入式系统的软件设计是需要多注意的!!
点赞  2009-11-21 13:36

还真是吃过这样的亏,
据说有的系统是可以设置大小端模式的,??
生活在激情中 ... 希望 哈哈 https://home.eeworld.com.cn/?80086
点赞  2009-11-21 16:50
可以设置大小端模式的,??
点赞  2009-11-21 18:04

回复 4楼 zhjzh72_2004 的帖子

MIPS处理器的大小端模式是可以设定的。一般为Big Endian,和网络序一致。
x86处理器则是小端模式。
点赞  2009-11-21 21:19
看不懂,路过,我级别太低,哎,好好学
点赞  2009-11-22 11:18

这次这个题我能看懂,但是答案吗~

平时用指针和共用体不多,学习来了。
点赞  2009-11-23 16:09

回复 7楼 sjl2001 的帖子

这个问题我在x86、MIPS和SPARC的处理器上都做过实验。大家也可以用计算机做个实验,在x86上(就是你运行Windows的电脑)和ARM上(如手头的开发板)做个实验,把数据从串口printf出来看看。
点赞  2009-11-23 17:03

pic是从后面数的。

果然啊,跟我想的不一样。
点赞  2009-11-23 19:27

回复 9楼 sjl2001 的帖子

多谢!也请各位多用手头的非8位机多做实验, 如MSP430,TI的DSP,EPSON的微控制器?
条件所限我手头只有x86,MIPS(一个高端路由器设备)、SPARC(一个SUN服务器帐号)。大家可以多试试各种处理器。
点赞  2009-11-23 20:28
哇,不懂啊。
点赞  2009-11-24 15:53
没涉及过,看不懂,要好好学啊
点赞  2009-11-24 16:08
在网上经常见到--帅云霓--这个名字,尤其在弯曲评论上!不知道是不是同一个人!
点赞  2009-11-24 22:17

这些都是一些很细的东西

学校课堂上不讲的东西多了,有很多讲了也是点到为止,一句带过,不是非常认真听课的学生可能根本就不会留意到:L
其实这些都是C语言最基础的基础,堪比武侠小说所说的“内功”
非常感谢楼主把这些东西提出来给大家来个“修炼内功”的机会
点赞  2009-11-25 10:04

头像是楼主本人吗

笑容好灿烂,长相很耐看
补充一下,印象中看到某些ARM也支持大小端自由设置
总之大家在遇到问题的时候多长个心眼,多多查看数据手册和编译器手册就可以解决大多数属于编程语言方面的问题
点赞  2009-11-25 10:17
这种情况应该尽量用指针吧。这样即时不能设置大小端也可从软件避免。另外对于C来说边界检查也是必要的。尽量不要使用这样的方式。
点赞  2009-11-25 11:28

回复 15楼 tywood 的帖子

引用: 原帖由 tywood 于 2009-11-25 10:17 发表
笑容好灿烂,长相很耐看
补充一下,印象中看到某些ARM也支持大小端自由设置
总之大家在遇到问题的时候多长个心眼,多多查看数据手册和编译器手册就可以解决大多数属于编程语言方面的问题:c ...


突然发现你很像郭芙蓉哎!!!
点赞  2009-11-25 11:37

回复 16楼 leang521 的帖子

这个问题来源于我改过的一个Bug,当然大大简化了周边条件,直取问题的本质。
点赞  2009-11-25 11:41

回复 18楼 richiefang 的帖子

C的特点就是可移植性。那么我们在软件编写的时候就应该考虑到这个问题。不同的编译器对同一句C的解释问题(对了,你估计没试过在X86上用不同编译器解释上面那段代码结果不同,我记得我们讲编译原理的时候详细讨论过这个问题),那么在代码编写的时候就要十分留意这种可能的错误。比如在公式中多用括号避免左右问题,在数列中多用指针避免大小端问题。
点赞  2009-11-25 11:56
引用: 原帖由 leang521 于 2009-11-25 11:56 发表
C的特点就是可移植性。那么我们在软件编写的时候就应该考虑到这个问题。不同的编译器对同一句C的解释问题(对了,你估计没试过在X86上用不同编译器解释上面那段代码结果不同,我记得我们讲编译原理的时候详细讨论过这 ...

当然,用Borland C++3.1和Visual C++的结果也不一样,因为一个16位一个32位。我们这里讨论的时候统一假设是32位系统和编译器。
长相这种八卦话题在技术版面讨论是不是不大好啊?
点赞  2009-11-25 14:05
123下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复