C medan bit
Jika struktur atur cara mengandungi berbilang suis, hanya terdapat pembolehubah TRUE/FALSE, seperti berikut:
struct{ unsigned int widthValidated; unsigned int heightValidated;} status;
Struktur ini memerlukan 8 bait ruang memori, tetapi sebenarnya, dalam setiap Dalam setiap pembolehubah , kami hanya simpan 0 atau 1 sahaja. Dalam kes ini, bahasa C menyediakan cara yang lebih baik untuk menggunakan ruang memori. Jika anda menggunakan pembolehubah sedemikian di dalam struktur, anda boleh menentukan lebar pembolehubah untuk memberitahu pengkompil bahawa anda hanya akan menggunakan bait ini. Sebagai contoh, struktur di atas boleh ditulis semula sebagai:
struct{ unsigned int widthValidated : 1; unsigned int heightValidated : 1;} status;
Kini, dalam struktur di atas, pembolehubah status akan menduduki 4 bait ruang memori, tetapi hanya 2 bit digunakan untuk menyimpan nilai. Jika anda menggunakan 32 pembolehubah, setiap pembolehubah adalah 1 bit lebar, maka struktur status akan menggunakan 4 bait, tetapi sebaik sahaja anda menggunakan satu lagi pembolehubah, jika anda menggunakan 33 pembolehubah, maka ia akan memperuntukkan bahagian memori seterusnya pembolehubah ke-33, 8 bait akan digunakan pada masa ini. Mari lihat contoh berikut untuk memahami konsep ini:
#include <stdio.h>#include <string.h>/* 定义简单的结构 */struct{ unsigned int widthValidated; unsigned int heightValidated;} status1;/* 定义位域结构 */struct{ unsigned int widthValidated : 1; unsigned int heightValidated : 1;} status2; int main( ){ printf( "Memory size occupied by status1 : %d\n", sizeof(status1)); printf( "Memory size occupied by status2 : %d\n", sizeof(status2)); return 0;}
Apabila kod di atas disusun dan dilaksanakan, ia akan menghasilkan keputusan berikut:
Memory size occupied by status1 : 8Memory size occupied by status2 : 4
Pengisytiharan Bitfield
Bitfields diisytiharkan dalam struktur dalam bentuk berikut:
struct{ type [member_name] : width ;};
Berikut ialah perihalan elemen pembolehubah dalam medan bit:
元素 | 描述 |
---|---|
type | 整数类型,决定了如何解释位域的值。类型可以是整型、有符号整型、无符号整型。 |
member_name | 位域的名称。 |
width | 位域中位的数量。宽度必须小于或等于指定类型的位宽度。 |
Pembolehubah dengan lebar yang dipratentukan dipanggil Bitfield. Medan bit boleh menyimpan lebih daripada 1 digit Contohnya, jika anda memerlukan pembolehubah untuk menyimpan nilai dari 0 hingga 7, anda boleh menentukan medan bit dengan lebar 3 bit, seperti berikut:
struct{ unsigned int age : 3;} Age;
Definisi struktur di atas Mengarahkan pengkompil C bahawa pembolehubah umur hanya akan menggunakan 3 bit untuk menyimpan nilai ini, dan jika anda cuba menggunakan lebih daripada 3 bit, ia tidak akan berfungsi. Mari lihat contoh berikut:
#include <stdio.h>#include <string.h>struct{ unsigned int age : 3;} Age;int main( ){ Age.age = 4; printf( "Sizeof( Age ) : %d\n", sizeof(Age) ); printf( "Age.age : %d\n", Age.age ); Age.age = 7; printf( "Age.age : %d\n", Age.age ); Age.age = 8; printf( "Age.age : %d\n", Age.age ); return 0;}
Apabila kod di atas disusun, ia akan datang dengan amaran Apabila kod di atas dilaksanakan, ia akan menghasilkan keputusan berikut:
Sizeof( Age ) : 4Age.age : 4Age.age : 7Age.age : 0