zoukankan      html  css  js  c++  java
  • 几道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的机器,都是小字节序,所以要注意转化一下,否则定义出来的结构也并不是我们想要的。
    而字节对齐的应用在网络的消息报文中也经常遇到。但一般情况下都是采用的自然对齐,这样在网络中进行数据交换时,如果采用的对齐方式不一致,可能出现数据对齐的问题。
    ================================
      /\_/\                        
     (=^o^=)  Wu.Country@侠缘      
     (~)@(~)  一辈子,用心做一件事!
    --------------------------------
      学而不思则罔,思而不学则怠!  
    ================================
  • 相关阅读:
    Codeforces Gym 100015F Fighting for Triangles 状压DP
    Codeforces Gym 100015B Ball Painting 找规律
    Codeforces Gym 100015A Another Rock-Paper-Scissors Problem 找规律
    Codeforces Gym 100231G Voracious Steve 记忆化搜索
    Codeforces Gym 100231F Solitaire 折半搜索
    Codeforces Gym 100231L Intervals 数位DP
    Codeforces Gym 100231B Intervals 线段树+二分+贪心
    Codeforces Round #339 (Div. 1) A. Peter and Snow Blower 计算几何
    Codeforces Round #339 (Div. 2) B. Gena's Code 水题
    Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题
  • 原文地址:https://www.cnblogs.com/WuCountry/p/1071298.html
Copyright © 2011-2022 走看看