Visual walkthrough — Bit fields in structs
5.1.23 · D2· Coding › C Programming › Bit fields in structs
Parent: Bit fields in structs. Yahan hum picture by picture build karte hain — exactly kitne tiny members ek storage box mein squeeze hote hain, kyun
sizeofwahan land karta hai jahan karta hai, aur har awkward edge par kya hota hai. Hum assume karte hain ki tum sirf itna jaante ho: "ek computer numbers ko 0s aur 1s ke roop mein store karta hai."
Step 1 — "Bit" aur "storage unit" kya hote hain?
WHAT. Ek bit ek single tiny slot hota hai jo do chezon mein se ek hold karta hai: 0 ya 1. Ek fixed number of bits ko ek saath group karo aur tumhe ek storage unit milti hai. C mein bit fields ke liye natural storage unit ek unsigned int hoti hai, jo zyaadatar machines par 32 bits wide hoti hai — socho ek row of 32 empty slots side by side.
WHY this picture. Isse pehle ki hum "3 bits wide member" ki baat karein, hume agree karna hoga ki woh bits kis shelf par rehte hain. Har bit field inhi 32-slot rows mein se ek se carve out hota hai. Agar tumne kabhi int ko bits ka box ki tarah nahi dekha, toh Data types and sizeof dekho.
PICTURE. Figure s01 dekho: ek lambi row of 32 slots, right side par bit 0 se left side par bit 31 tak numbered. Poori row ek unsigned int hai.

Step 2 — Slots reserve karna: member : width
WHAT. Syntax unsigned int a : 5; ka matlab hai "member a ko exactly 5 slots do." Hum poora 32-bit integer store nahi kar rahe — hum 32 slots mein se sirf 5 rent kar rahe hain aur baaki 27 baad ke members ke liye free chhod rahe hain.
WHY this tool and not a normal int? Ek normal int member hamesha poori row (32 slots) le leta hai, chahe sirf ek yes/no flag store karna ho. : width notation C mein akela tarika hai yeh kehne ka "mujhe ek poore type se kam slots chahiye." Yahi Bit fields in structs ka poora point hai.
PICTURE. Figure s02 pehle 5 slots (bits 0–4) ko member a ke roop mein shade karta hai. Arrow notice karo: compiler ek marker rakhta hai jise offset kehte hain, jo pehle still-free slot ki taraf point karta hai — abhi yeh bit 5 par point kar raha hai.

Step 3 — Doosra field place karna: offset aage badhana
WHAT. unsigned int b : 5; add karo. Compiler apna offset marker padhta hai (bit 5 par point kar raha hai), b ko agle 5 free slots (bits 5–9) mein daalta hai, phir offset ko bit 10 par push karta hai.
WHY. Yahi packing hai: consecutive small fields ek hi row mein shoulder-to-shoulder baithte hain, koi gap nahi. Yahan se memory saving aati hai — teen alag ints ko 3 rows chahiye honge; yahan a aur b ek share karte hain.
PICTURE. Figure s03 mein tum ek row mein do shaded blocks dekhte ho: a (bits 0–4) aur b (bits 5–9). Offset arrow bit 10 tak khisakhi hai. Slots 10–31 abhi bhi empty hain.

Step 4 — Row ka overflow: jab ek field fit nahi hota
WHAT. Ab unsigned int c : 25; add karo. Offset bit 10 par hai, toh sirf slots bacha hai. Lekin c ko 25 chahiye. Yeh bacha hua 22 mein fit nahi ho sakta.
WHY. Ek single bit field ko storage unit ki boundary cross karne ki ijazat nahi hai (yeh "no-split" behaviour hi ek naya row force karta hai). Toh compiler bacha hua slots chhod deta hai aur c ko ek fresh 32-slot row ke shuru se start karta hai.
PICTURE. Figure s04 mein row 1 dikhta hai a, b, aur 22 wasted slots ke saath, aur row 2 c (bits 0–24) hold karta hai. Do rows = 8 bytes total.

Step 5 — Slots fill karna: field mein value padhna
WHAT. Ek field mein koi number store karo, jaise b = 13. Compiler 13 ko binary mein b ke 5 slots mein likhta hai: , jo fit ho jaata hai (5 slots hold kar sakte hain).
WHY. Field ke andar ke bits ek unsigned number ki tarah in place padhe jaate hain — sabse right wala rented slot ones place hai, uske baad twos place hai, aur aage bhi aise hi, exactly Unsigned vs signed integers ki tarah, bas kam digits ke saath.
PICTURE. Figure s05 b ke 5 slots ko zoom in karta hai aur har ek ko uski place value ke saath label karta hai, pattern dikhata hai jo sum karta hai.

Har digit ko uske neeche likhi place value se multiply kiya jaata hai, aur sum stored value hoti hai.
Step 6 — Field ka overflow: jo digits gir jaate hain
WHAT. s.v = 13 assign karo ek 3-slot field unsigned v : 3 mein. Lekin ko 4 slots chahiye — ek zyada. C error nahi karta. Woh sirf low 3 slots rakhta hai aur baaki discard kar deta hai.
WHY. "Low bits" rakhna arithmetically se divide karne ke baad remainder lene jaisa hi hai — kyunki position ke upar ka har bit ek aisi value carry karta hai jo ka multiple hai, aur se divide karne par exactly woh sab chale jaate hain.
PICTURE. Figure s06 mein 4-bit pattern aata dikhta hai, top wala 1 left edge se (red mein) slip ho jaata hai, aur field mein bachta hai.

Step 7 — Sign trap: signed fields apna top slot kho dete hain
WHAT. signed int x : 3; declare karo. Lagta hai yeh store karta hai (3 slots = 8 values). Lekin nahi karta. Top (sabse left) rented slot ek sign flag ban jaata hai: wahan 1 ka matlab hai "yeh negative hai."
WHY. Signed integers two's complement use karte hain: highest slot ek negative weight carry karta hai. 3 slots ke saath weights hain , toh reachable numbers tak hain — phir bhi 8 values, lekin zero se neeche shifted. Dekho Unsigned vs signed integers.
PICTURE. Figure s07 do 3-slot fields side by side compare karta hai: unsigned (weights , range ) versus signed (weights , range ).

Step 8 — Forced boundary: unsigned : 0;
WHAT. Ek unnamed, zero-width field unsigned : 0; kuch rent nahi karta lekin ek kaam karta hai: offset ko seedha next storage unit ke shuru mein jump karta hai.
WHY. Kabhi kabhi hardware demand karta hai ki ek field exactly ek fresh 32-bit boundary par start kare (ek register jo do words mein split ho, jaise — Embedded systems / hardware registers ki duniya). Zero-width field deliberate "next row pe jump karo" instruction hai; yeh bit fields ke liye Memory alignment and padding control hai.
PICTURE. Figure s08 mein row 1 mein low : 4 dikhta hai, zero-width marker fire karta hai, aur high : 4 row 2 ke bit 0 se fresh start karta hai.

struct Reg {
unsigned low : 4; // row 1, bits 0..3
unsigned : 0; // JUMP to next unit
unsigned high : 4; // row 2, bits 0..3
};Ek-picture summary
Figure s09 poori story ek diagram mein thread karta hai: ek field rented slots hai → offset bookmark aage badhta hai → ek field jo row se bahar jaata hai naya row start karta hai → ek value jo field ke liye too big hai uske top bits gir jaate hain (mod ) → ek signed field apna top slot sacrifice karta hai → aur : 0 ek fresh row force karta hai.

Recall Feynman: poora walkthrough plain words mein retell karo
Socho ek shelf with 32 tiny slots. Jab tum a : 5 likhte ho, tum pehle 5 slots rent karte ho aur unke theek baad ek bookmark rakhte ho. b : 5 maango toh woh agle 5 slots mein baithta hai, bookmark aage khisakta hai. Jab sirf 22 slots bacha ho aur 25-slot field maango, toh woh edge ke paas split hone se inkaar karta hai — isliye poora naya shelf le leta hai, leftover slots waste ho jaate hain (isliye struct 8 bytes tak grow karta hai). Ek field ke andar, slots sirf place values hain; 3-slot field mein 13 store karo toh "8" part ke liye jagah nahi, toh woh gir jaata hai aur bachta hai — same as . Agar field signed hai, toh uska top slot "minus" mean karne ke liye flip ho jaata hai, toh 3-slot signed field to ki jagah to run karta hai. Aur agar tumhe kabhi field fresh shelf ke bilkul saamne se shuru karni ho, toh unsigned : 0; daal do — yeh kuch rent nahi karta lekin bookmark ko next shelf ke slot 0 par dhakka de deta hai.
Connections
- Bit fields in structs — parent jise yeh walkthrough visualise karta hai.
- Structs in C — woh container jisme yeh members rehte hain.
- Bitwise operators — same slot-shuffling ka manual
& | << >>version. - Data types and sizeof — kyun storage unit ek
inthoti hai. - Memory alignment and padding —
unsigned : 0;kya control karta hai. - Unsigned vs signed integers — two's-complement top-slot sign.
- Embedded systems / hardware registers — kyun forced boundaries matter karti hain.