Wu.Country@侠缘

勤学似春起之苗,不见其增,日有所长; 辍学如磨刀之石,不见其损,日所有亏!

导航

几道C语言题目,有兴趣的可以自己动手试试

最近学习C语言知识,从网上收集了一些内容,自己也总结了一些,感觉这几题有点意思,有兴趣的可以自己试试:
1、字节对齐问题:

#pragma pack(4)
typedef 
struct _S_1
{
    
char a;            
    long b;            
    char c;            
}
S_1;
#pragma pack()

#pragma pack(2)
typedef 
struct _S_2
{
    
char a;        
    S_1 b;        
    long c;        
    char d;        
}
S_2;
#pragma pack()
问:sizeof(S_2)为多少?
展开,上面有两个pack(N),随意修改这个N,结果又会是什么?例如:一个是1,一个是4,两个都是4,两个都是1,或者其它任意组合,结果是多少?
最简单的方法是上机去试试,但也要明白原理!

2、位域问题:
#pragma pack(1)
typedef union _Message
{
    
long Result;
    
struct _Data
    
{
        
char a;
        
short b:1;
        
short c:2;
        
short d:3;
        
short e:4;
        
short f:6;
        
char g;
    }
Data;
}
 Message;
#pragma pack()
int main()
{    
    Message m_msg;
    m_msg.Data.a 
= 0x01;
    m_msg.Data.b 
= 0x02;
    m_msg.Data.c 
= 0x03;
    m_msg.Data.d 
= 0x04;
    m_msg.Data.e 
= 0x05;
    m_msg.Data.f 
= 0x06;
    m_msg.Data.g 
= 0x07;
    
//printf("%d\n",sizeof(Message));
    printf("%0.8X\n",m_msg.Result);
    
return 0;
}
问:在小字节序下,结果是多少?在大字节序下,结果又是多少?
如果不明白什么是字节序,那就直接回答,在Intel的CPU下结果是多少就行了。
注意:这里必须使用pack(1),否则结果并不是预期的样子。而且b,c,d,e,f,必须定义成short,如果不是short是其它的数据类型,结果又会不一样!

两个问题都可以在VC下进行测试,有兴趣的自己动手试试,体会一下!
第二题无法演示在大字节序下的情况,因此无法演示结果,只能看理论上解答!

答案(最好是自己理论求解再来用VC来验证):
1:20
2:07196601(小字节序);01714607(大字节序)
     
应用场景:不要觉得这样的题目很变态,实际上它的应用场景是很多!
例如一个以太网的帧格式,它有2个48bit的MAC地址,还有一些报文类型,用4个bit来表示,还有其它的一些信息,都不是用byte来表示的,而是用几个bit表示。如何定义这样的以太网帧格式,就会与上面的问题相关了。而且网络中传输的数据是采用的大字节序,而我们一般的PC机,或者说是兼容Intel CPU的机器,都是小字节序,所以要注意转化一下,否则定义出来的结构也并不是我们想要的。
而字节对齐的应用在网络的消息报文中也经常遇到。但一般情况下都是采用的自然对齐,这样在网络中进行数据交换时,如果采用的对齐方式不一致,可能出现数据对齐的问题。

posted on 2008-02-17 15:22  Wu.Country@侠缘  阅读(959)  评论(0编辑  收藏  举报