Mặc dù tiêu chuẩn ANSI C chỉ định quá ít về cách các trường bit được đóng gói để cung cấp bất kỳ lợi thế đáng kể nào so với việc "trình biên dịch được phép đóng gói các trường bit theo cách họ thấy phù hợp", tuy nhiên trong nhiều trường hợp, nó cấm các trình biên dịch đóng gói mọi thứ theo cách hiệu quả nhất.
Đặc biệt, nếu một cấu trúc chứa trường bit, trình biên dịch được yêu cầu lưu trữ nó dưới dạng cấu trúc chứa một hoặc nhiều trường ẩn danh của một số kiểu lưu trữ "bình thường" và sau đó chia nhỏ từng trường đó thành các phần trường bit cấu thành của nó một cách hợp lý. Do đó, đã cho:
unsigned char foo1: 3;
unsigned char foo2: 3;
unsigned char foo3: 3;
unsigned char foo4: 3;
unsigned char foo5: 3;
unsigned char foo6: 3;
unsigned char foo7: 3;
Nếu unsigned char
là 8 bit, trình biên dịch sẽ được yêu cầu cấp phát bốn trường thuộc loại đó và gán hai trường bit cho tất cả trừ một trường (sẽ nằm trong một char
trường của riêng nó). Nếu tất cả các char
khai báo đã được thay thế bằng short
, thì sẽ có hai trường kiểu short
, một trong số đó sẽ chứa năm trường bit và trường kia sẽ chứa hai trường còn lại.
Trên một bộ xử lý không có giới hạn căn chỉnh, dữ liệu có thể được sắp xếp hiệu quả hơn bằng cách sử dụng unsigned short
cho năm trường đầu tiên và unsigned char
hai trường cuối cùng, lưu trữ bảy trường ba bit trong ba byte. Mặc dù có thể lưu trữ tám trường ba bit trong ba byte, nhưng trình biên dịch chỉ có thể cho phép điều đó nếu tồn tại kiểu số ba byte có thể được sử dụng làm kiểu "trường ngoài".
Cá nhân tôi coi các trường bit được định nghĩa là về cơ bản là vô dụng. Nếu mã cần hoạt động với dữ liệu được đóng gói nhị phân, nó phải xác định rõ ràng vị trí lưu trữ của các loại thực tế, sau đó sử dụng macro hoặc một số phương tiện tương tự khác để truy cập các bit của chúng. Sẽ rất hữu ích nếu C hỗ trợ một cú pháp như:
unsigned short f1;
unsigned char f2;
union foo1 = f1:0.3;
union foo2 = f1:3.3;
union foo3 = f1:6.3;
union foo4 = f1:9.3;
union foo5 = f1:12.3;
union foo6 = f2:0.3;
union foo7 = f2:3.3;
Cú pháp như vậy, nếu được cho phép, sẽ làm cho mã có thể sử dụng các trường bit theo kiểu di động, bất kể kích thước từ hoặc chuỗi byte (foo0 sẽ nằm trong ba bit có ý nghĩa nhỏ nhất của f1, nhưng chúng có thể được lưu trữ tại địa chỉ thấp hơn hoặc cao hơn). Tuy nhiên, vắng mặt một tính năng như vậy, macro có lẽ là cách di động duy nhất để hoạt động với những thứ như vậy.