18.位域
阿新 • • 發佈:2018-08-18
val 空間 string.h 開始 member 使用 數量 符號整型 變量
//C位域 /* struct { unsigned int widthValidated; unsigned int heightValidated; } status; 這種結構需要 8 字節的內存空間,但在實際上,在每個變量中,我們只存儲 0 或 1。 在這種情況下,C 語言提供了一種更好的利用內存空間的方式。 如果在結構內使用這樣的變量,可以定義變量的寬度來告訴編譯器,將只使用這些字節。 例如,上面的結構可以重寫成: struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status; 現在,上面的結構中,status 變量將占用 4 個字節的內存空間,但是只有 2 位被用來存儲值。 如果用了 32 個變量,每一個變量寬度為 1 位,那麽 status 結構將使用 4 個字節, 但只要再多用一個變量,如果使用了 33 個變量,那麽它將分配內存的下一段來存儲第 33 個變量, 這個時候就開始使用 8 個字節。讓我們看看下面的實例來理解這個概念: */ #include <stdio.h> #include <string.h> struct { unsigned int a; unsigned int b; }s1; struct { unsigned int a:1; unsigned int b:2; }s2; int main01() { printf("memory size occupied by s1=%d\n", sizeof(s1)); //memory size occupied by s1=8 printf("memory size occupied by s2=%d\n", sizeof(s2)); //memory size occupied by s2=4 } //位域聲明 /* 在結構內聲明位域的形式如下: struct { type [member_name] : width ; }; 元素 描述 type 整數類型,決定了如何解釋位域的值。類型可以是整型、有符號整型、無符號整型。 member_name 位域的名稱。 width 位域中位的數量。寬度必須小於或等於指定類型的位寬度。 帶有預定義寬度的變量被稱為位域。 位域可以存儲多於 1 位的數, 例如,需要一個變量來存儲從 0 到 7 的值,可以定義一個寬度為 3 位的位域,如下: struct { unsigned int age : 3; } Age; */ //舉個栗子 struct { unsigned int age : 3; } Age; int main() { Age.age = 4; printf("sizeof(Age)=%d\n", sizeof(Age)); //sizeof(Age)=4 printf("Age.age=%d\n", Age.age); //Age.age=4 Age.age = 7; //二進制表示111,已達到最大值,再大的數字將無法存儲 printf("sizeof(Age)=%d\n", sizeof(Age));//sizeof(Age)=4 printf("Age.age=%d\n",Age.age); //Age.age=7 Age.age = 8; //二進制表示有四位,1000,溢出 printf("sizeof(Age)=%d\n",sizeof(Age));//sizeof(Age)=4 printf("Age.age=%d\n",Age.age); //Age.age=0,這裏打印的是0 //因此超出範圍,則直接丟掉了,因為存不進去 }
18.位域