5.1.23 · HinglishC Programming

Bit fields in structs

1,614 words7 min readRead in English

5.1.23 · Coding › C Programming

Topic: Data ko individual bits mein pack karna ek struct ke andar, taaki har member sirf utne hi bits use kare jitne aap maango, na ki poora byte/int.

The Big Picture

struct Flags {
    unsigned int isActive : 1;   // 1 bit  -> stores 0 or 1
    unsigned int level    : 3;   // 3 bits -> stores 0..7
    unsigned int mode     : 4;   // 4 bits -> stores 0..15
};

WHY do bit fields exist?

  • WHAT problem: memory aur hardware registers. Ek device status register ek 8-bit byte ho sakta hai jahan bit 0 = "ready", bits 1–3 = "speed", etc.
  • WHY useful: aap memory bachate ho jab kai chhoti values store karni hon (network packet headers, embedded systems, file formats) aur aap hardware bit layouts ko directly C mein mirror kar sakte ho.
  • HOW it works: compiler ek "current storage unit" aur ek offset track karta hai; har naya bit field agli free bits pe place hota hai, offset aage badhta jaata hai. Jab ek field fit nahi hoti (ya aap force karte ho), ek naya unit shuru hota hai.

How many values fit in N bits?


Memory layout and packing

Figure — Bit fields in structs
struct S {
    unsigned a : 5;   // boxes 0..4
    unsigned b : 5;   // boxes 5..9
    unsigned c : 25;  // would need boxes 10..34 -> won't fit!
};                    // c starts a NEW int  => struct is 8 bytes

The zero-width trick

struct Reg {
    unsigned low  : 4;
    unsigned : 0;        // align to next unit
    unsigned high : 4;   // starts in a new int
};

Rules & Restrictions (the gotchas)


Forecast-then-Verify


Flashcards

x naam ka 4-bit unsigned struct member kaise declare karte hain?
unsigned int x : 4;
Ek N-bit unsigned bit field mein kitne distinct values hote hain?
(range to ).
Bit field flag ke liye &s.flag illegal kyun hai?
Bit fields byte-addressable nahi hote; yeh byte boundary pe shuru nahi ho sakte, isliye inka koi address nahi hota.
3-bit field mein 9 assign karne par kya hota hai?
Yeh low 3 bits pe truncate ho jaata hai: (koi error/warning nahi).
Unnamed zero-width field unsigned : 0; kya karta hai?
Agla bit field ek fresh storage unit mein shuru hone ke liye force ho jaata hai (alignment).
Teen 1-bit fields wale struct ka sizeof 1 nahi balki 4 kyun ho sakta hai?
Compiler inhe hold karne ke liye ek poora storage unit (ek int) allocate karta hai.
Bit fields ke liye kaun se types allowed hain?
Integer types: int, signed int, unsigned int, aur _Bool (C99).
Ek signed 3-bit field ki range?
−4 to 3 (top bit sign ke liye hai).
Kya bit-field allocation order (low→high vs high→low) standard se defined hai?
Nahi — yeh implementation-defined hai.

Recall Feynman: explain to a 12-year-old

Ek lambi shelf socho jisme 32 chhote slots hain. Normally agar aap ek haan/naa ka jawaab store karna chahte ho, toh aap ek poori alag shelf ke 32 slots barbaad kar dete ho. Bit fields aapko kehne dete hain "is jawaab ko sirf 1 slot chahiye," toh aap ek shelf pe bahut saare chhote jawaab fit kar sakte ho. Catch yeh hai: kyunki jawaab ek chhote se slot mein thunsa hua hai, apne labeled box mein nahi, aap use point karke nahi keh sakte "yeh uska exact address hai" — aur agar aap usme bahut bada number store karne ki koshish karo, toh extra digits bas edge se gir jaate hain.

Connections

  • Structs in C — bit fields ek special tarah ke struct member hain.
  • Bitwise operators& | ^ << >> bit fields ke manual alternative hain.
  • Data types and sizeof — kyun int storage unit hai.
  • Memory alignment and padding — zero-width field alignment control karta hai.
  • Embedded systems / hardware registers — main real-world use case.
  • Unsigned vs signed integers — khoya hua sign bit explain karta hai.

Concept Map

declared with

must use

specifies

exists to

exists to

packed via

managed by

determines

pitfall when

solved by

Bit field

Syntax type member colon width

Integer type required

Explicit bit width

Saves memory

Mirrors hardware registers

Packed into storage unit

Compiler tracks offset

Range 0 to 2^N minus 1

Signed field loses top bit

Use unsigned explicitly