1. 程式人生 > >18.位域

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.位域