C99 chuẩn 6.7.2.1/10 (tôi nhấn mạnh):
An thực hiện có thể phân bổ bất kỳ đơn vị lưu trữ địa chỉ đủ lớn để tổ chức một bitfield. Nếu đủ không gian còn lại, một trường bit ngay sau một trường bit khác trong một cấu trúc sẽ được đóng gói thành các bit liền kề của cùng một đơn vị. Nếu không đủ không gian, dù một trường bit không vừa với được đặt vào đơn vị kế tiếp hay chồng chéo các đơn vị lân cận được xác định thực hiện. Thứ tự phân bổ các trường bit trong một đơn vị (thứ tự cao đến thứ tự thấp hoặc thứ tự thấp đến thứ tự cao) được xác định thực hiện. Căn chỉnh của đơn vị lưu trữ địa chỉ không xác định.
Vì vậy, thứ tự phải được ghi lại bằng cách triển khai trình biên dịch của bạn.
Tuy nhiên, rất nhiều về cách thực hiện bitfield được xác định hoặc không xác định rằng sử dụng chúng để tạo mô hình phần cứng, giao thức dây hoặc trường bit định dạng tệp theo kiểu di động không đáng để thử.
Nếu bạn muốn 'lĩnh vực chút' của bạn để mô hình một cái gì đó bên ngoài để chương trình của bạn (như những điều ở trên), sử dụng mặt nạ rõ ràng, thiết lập và thanh toán bù trừ các bit sử dụng các toán tử chuẩn bit-wise (|
, '& ,
~ ,
< < `, v.v ...). Sử dụng các hàm trợ giúp nội dòng (hoặc thậm chí các macro nếu bạn phải) để làm cho điều này dễ dàng hơn/rõ ràng hơn trong mã của bạn.
Nguồn
2010-12-28 17:20:34
Lưu ý: Theo tiêu chuẩn, MSB không được xác định. Trên nền tảng cụ thể của bạn, tôi nghi ngờ rằng 'reserved' chứa MSB nhưng tôi không tích cực. –
@Billy: Điều đó trông giống như một câu trả lời cho tôi. –
Er ... Đó là một câu hỏi khá lạ. Bạn chỉ có 3 bit trường trong khai báo của bạn. 2 trong số đó là các trường bit 1 bit, tức là không có vấn đề "kết thúc" nào với chúng, vì chỉ có 1 bit ở đó. Trường bit nhiều bit duy nhất được gọi là 'reserved', cho thấy nó không được sử dụng chút nào. Vì vậy, về cơ bản, trường bit duy nhất mà bạn đặt câu hỏi có thể áp dụng là 'reserved'. Bạn đang hỏi về 'reserved' đặc biệt? Nếu không, hãy làm rõ câu hỏi của bạn. – AnT