1. 程式人生 > >字節對齊 練習

字節對齊 練習

code c語言 int 新的 windows 域名 跨域 64位 com

http://m.nowcoder.com/questions?uuid=a1f3b90249ff4666879e8f695915ed7f

在32位cpu上選擇缺省對齊的情況下,有如下結構體定義:

#include "iostream"
using namespace std;

struct Zijie
{
    unsigned a : 19;
    unsigned b : 11;
    unsigned c : 4;
    unsigned d : 29;
    char index;
};
int main()
{
        int t = sizeof(struct Zijie);
        cout 
<< t << endl; system("pause"); return 0; }

在64位windows上運行是16

分析: 由於在32位cpu上選擇缺省對齊的情況下,所以每行支持4個字節即32bit 於是a和b公用一行19+11 = 30bit還剩2bit,又因為c為4bit,無法全部占據該行,故其重新開始一行,第一行空出2bit; 對於第二行,c占據前4bit,同理由於d占據29bit, 無法全部占據該行的剩余空間,所以其處於第三行,第二行中剩余28bit空出; 同理可分析第三行和第四行的空間,由於第四行占據1個直接,為了保持對其需要把剩余空間補齊 綜上該結構體的大小為4*4個字節 = 16 對於這道題,首先需要知道位域的概念。 位域是指信息在存儲時,並不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分為幾 個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。 位域的定義和位域變量的說明
位域定義
與結構定義相仿,其形式為:
struct 位域結構名
{ 位域列表 };
其中位域列表的形式為: 類型說明符 位域名:位域長度 位域表示法 C99規定int、unsigned int和bool可以作為位域類型,但編譯器幾乎都對此作了擴展,
允許其它類型類型的存在。
使用位域的主要目的是壓縮存儲,其大致規則為:
1) 如果相鄰位域字段的類型相同,且其位寬之和小於類型的sizeof大小,則後面的字
段將緊鄰前一個字段存儲,直到不能容納為止;
2) 如果相鄰位域字段的類型相同,但其位寬之和大於類型的sizeof大小,則後面的字
段將從新的存儲單元開始,其偏移量為其類型大小的整數倍;(經測試此條好像僅限於char型,整型可以跨域存儲)
3) 如果相鄰的位域字段的類型不同,則各編譯器的具體實現有差異,VC6采取不壓縮方
式,Dev-C++采取壓縮方式;
4) 如果位域字段之間穿插著非位域字段,則不進行壓縮;
5) 整個結構體的總大小為最寬基本類型成員大小的整數倍。

字節對齊 練習