C'deki bit alanları (bit fields), standart tip boyutunun yerine belirli sayıda bit işgal eden yapı elemanlarıdır. Özellikle bayrakları ve kompakt durum kümesini saklamak için bellek tasarrufu sağlar.
Tanım:
struct Flags { unsigned int enable : 1; unsigned int mode : 2; unsigned int code : 5; };
Bu örnekte, yapı minimum 8 bit işgal eder, 3 * sizeof(unsigned int) değil.
Nerelerde Kullanılır:
Sınırlamalar ve Sıkıntılar:
Örnek:
struct Packet { unsigned char start : 1; unsigned char id : 3; unsigned char flag : 4; };
Soru: Bit alanları için char veya signed int türü kullanabilir miyiz?
Cevap: C standardı int, unsigned int ve (derleyici uzantılarıyla) diğer standart tam sayı türlerini (char, short) kullanmaya izin verir. Ancak taşınabilirlik yalnızca int ve unsigned int için garanti edilir.
Hata Örneği:
struct Example { signed char a : 3; }; // Farklı derleyiciler/mimari sistemlerde işaret ve bit sırası ile ilgili farklı saklama kuralları mevcuttur.
Hikaye
ARM ve x86 üzerinde yazılım entegrasyonu sırasında, bit alanlarıyla olan yapının farklı şekilde açıldığı ortaya çıktı: bit sıralarında ve hizalamada farklılıklar. Bu farklılıklar dikkate alınmadan projelendirildi, bu da çoklu platform ortamında verilerin okunamaz hale gelmesine neden oldu.
Hikaye
Motor kontrol sisteminde bit alanlarında
chartürü yanlışlıkla kullanıldı. Bazı ARM işlemcilerde, bu işaret genişletme hatalarına yol açtı ve bayrakların yanlış işlenmesine neden oldu.
Hikaye
Ağ protokolünde mesaj bayraklarını paketlemek için bit alanları kullanıldı; üst bitlerin başlatılmamış alanların çer çöp kalacağını göz ardı ettiler. Cihazlar arasında aktarım sırasında, başlangıç durumlarındaki farklılıklardan ötürü rastgele durumsal hatalar meydana geldi.