5.6. Alanlar
Bazı durumlarda, dar bir yer içine (örneğin
bir tamsayı boyunda bir bölgeye) birçok bilgi sığdırmamız gerekebilir. Bunun
nedeni bellek tasarrufu olabildiği gibi, program dışındaki bazı durumlardan
(örneğin donanım aygıtlarına olan arabirimlerden) kaynaklanabilir. Bunu yapmak
için bir yapının üyelerini bit uzunluklarını da vererek tanımlarız. Bu tür
üyelere alan adı verilir. Doğal olarak, uzunluklar sıfırdan küçük
olmayan değişmez ifadelerdir. Tanım yapılarda olduğu gibidir; sadece her
üyenin arkasına iki nokta ile uzunluk verilebilir. Erişim de yapılarda olduğu
gibi “.” veya “->”
işleçleri ile yapılır. Bir örnek:
struct tarih {
unsigned yil : 7;
unsigned ay : 4;
unsigned gun : 5;
};
Burada, tarihin iki bayt
(sizeof(struct tarih) 2’dir)
içine sığdırılabileceği bir yapı tanımlanmaktadır. yil 7 bit
kullanır (işaretsiz olduğu için, değeri 0’dan
27-1=127’e kadar değişebilir ve örneğin
1950 ile 2077 arasındaki yılları ifade etmek için kullanılabilir),
ay 4 bit (0’dan
24-1=15’e kadar değişir),
gun ise 5 bittir (0’dan
25-1=31’e kadar değişir). Eğer uzunlukları
belirtmemiş olsaydık, her üye 2 bayt kullanacak, böylece tüm yapı 6 bayt
kaplayacaktı.
Alanlarla uğraşan birisinin dikkat etmesi gereken kurallar şöyle özetlenebilir:
- Alan tipi
unsignedbir tamsayı olmalıdır. Standart, en azındanunsigned int’in desteklenmesini gerektirir. - Bitlerin alanlara atanma tarzı (soldan sağa veya sağdan sola) derleyiciye bağlıdır.
-
Eğer bir alan sözcük sınırlarını (sistemimizde,
shortveintiçin 16,longiçin 32 vechariçin 8 bitlik sınırları) kesecek şekilde tanımlanırsa bir sonraki sözcükten başlatılır; kullanılmakta olan sözcükteki bitler kullanılmaz. Örneğin,struct dnm { unsigned a1 : 12; unsigned a2 : 5; unsigned a3 : 12; };aşağıdaki biçimde 6 bayt kaplar:
12 bit
a1, 4 bit kullanılmıyor (ilk sözcük, yani iki bayt),5 bit
a2, 11 bit kullanılmıyor (ikinci sözcük),12 bit
a3, 4 bit kullanılmıyor (üçüncü sözcük).Eğer
unsignedyerineunsigned longkullanmış olsaydık, yapı aşağıdaki biçimde 4 bayt kaplayacaktı:12 bit
a1, 5 bita2, 12 bita3, 3 bit kullanılmıyor (birlongsözcük, yani 4 bayt).Eğer
unsigned charkullanmış olsaydık, tanım kabul edilmeyecekti, çünkü alana112 bit uzunluğundadır, oysa bircharen fazla 8 bit tutabilir. Bu, bir alanın kendi tipinden daha geniş olamayacağı anlamına gelir. Eğer bir alan için bit sayısı belirtilmemişse, o tip için en büyük değer kullanılır. - Alanlardan oluşan diziler tanımlanamaz.
- Adres alma işleci (
&) alanlara uygulanamaz, böylece alanlar gösterge kullanarak doğrudan doğruya adreslenemezler. -
Alan isimleri isteğe bağlıdır. Eğer bir alanı kullanmayı düşünmüyorsanız—örneğin yukarıdaki örnekte
a2’yi—tipi ve alan ismini atlayın. Örneğin,struct dnm { unsigned a1 : 12; : 5; unsigned a3 : 12; }; -
Eğer bir sonraki sözcüğün başına atlamak istiyorsanız, araya 0 genişliğinde bir boş alan koyun. Örneğin, sistemimizde
struct dnm { unsigned a1 : 12; : 0; unsigned a3 : 12; };ile
struct dnm { unsigned a1 : 12; : 4; unsigned a3 : 12; };eşdeğerdir. Neden?
- Alanlar da tıpkı yapı üyeleri gibi ilklenebilirler, fakat alan için çok büyük olan bir değer vermemeye dikkat etmek gerekir.
