對C語言中結構體的測試分析

來源:互聯網
上載者:User
今天看到一本書中有與下面這種結構體類似的使用形式:
typedef struct some_dev{
        unsigned int var1 : 8;
        unsigned int var2 : 13;
}
特意在VC++ 6.0中做了幾個測試:
測試1:
#include <stdio.h>
typedef struct test1{
    unsigned int testint:8;
    char *p :32;
    int test2 : 16;
} test;

int main()
{
    test obj;
    obj.testint = 32;
    obj.test2 = 256;
    char *t="hello world!";
    obj.p=t;
    printf("\n\t%u.......%d.........%s", obj.testint, obj.test2 , obj.p);
    return 0;
}
編譯結果:
struct_t.obj - 2 error(s), 0 warning(s)
error C2033: 'p' : bit field cannot have indirection
error C2034: 'p' : type of bit field too small for number of bits
即便指標p的長度為32或者64,編譯都不能通過。
所以我們可以這樣認為:
      1:指標類型變數不能指定所佔的位元
測試2:
#include <stdio.h>
typedef struct test1{
    unsigned int testint:8;
    char *p;
    int test2 : 16;
} test;

int main()
{
    test obj;
    obj.testint = 32;
    obj.test2 = 256;
    char *t="hello world!";
    obj.p=t;
    printf("\n\t%u.......%d.........%s\n", obj.testint, obj.test2 , obj.p);
    return 0;
}
編譯連結均沒有錯誤警告資訊,運行結果為:
 32.......256.........hello world!Press any key to continue
測試3:
#include <stdio.h>
typedef struct test1{
    unsigned int testint:8;
    char *p;
    int test2 : 16;
} test;

int main()
{
    test obj;
    obj.testint = 256;          //這裡修改obj.testint的值為256
    obj.test2 = 256;
    char *t="hello world!";
    obj.p=t;
    printf("\n\t%u.......%d.........%s\n", obj.testint, obj.test2 , obj.p);
    return 0;
}
運行結果為:
 0.......256.........hello world!

可以看到,成員變數obj.testint的運行結果已經變成“0”.
為什麼呢??
原來在結構體聲明的時候,我們給obj.testint的bit數聲明為8b的unsigned類型,它可以表示的最大值為(2^8 - 1),即255,我們在第三個測試中,給它賦值256,它的二進位值為:1 0000 0000 b,系統在保留時,只保留了後8位的值,對溢出的位,進行了截取拋棄處理,所以這裡輸出的結果為0.
而輸出sizeof(struct test)的結果為:12
也就是說這三個成員變數各佔4個位元組。
再測試幾組資料,結果也都能證明下面的結論:
      2. 在聲明成員變數時,可以用
         變數名 :bit數;
來確定結構體類型的成員變數的值所佔的字位元,如果在實際應用中,該變數的值超出了在聲明它時所聲明的字位元,那麼溢出的部分將會丟失。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.