2014-11-03 23 views
6

fount tuyên bố này A-width zero trường bit có thể gây ra trường bên cạnh được xếp trên ranh giới chứa tới nơi container là kích thước tương tự như các loại cơ bản của lĩnh vực chútCác loại khác nhau cho các trường bit có độ dài bằng không trong c?

Để đưa nó vào thực tế giả sử int là 2 byte (16 bit) và ngắn là 1 byte (8 bit) để lưu gõ. Ngoài ra chúng ta hãy nói rằng chúng tôi đang sử dụng trình biên dịch gcc (sẽ được tốt đẹp để giải thích sự khác biệt để kêu vang).

struct foo { 
    unsigned int a:5; 
    unsigned int :0; 
    unsigned int b:3; 
} 

Trong bộ nhớ này trông giống như

struct address 
    |    
    | 
    v 
    aaaaa000 00000000 bbb00000 00000000 

Câu hỏi 1: Trong sự hiểu biết của tôi nó có thể không nhìn như aaaaa000 00000000 0..00bbb00000..., Vì vậy bbb phải phù hợp với container trực tiếp sau chứa hiện tại. Điều này có đúng không?

Di chuyển trên, nếu tôi chỉ định

struct bar { 
    unsigned short x:5; 
    unsigned int :0; 
    unsigned short y:7; 
} 

nó sẽ như thế nào vậy?

struct address 
    | short stops here   short starts 
    |  |     | 
    v  v | this is uint | v    
    xxxxx000 00000000 00000000 yyyyyyy0 

Sửa 1 Nó được chỉ ra rằng ngắn không thể ít hơn 16 byte. Đó là hơi bên cạnh điểm trong câu hỏi này. Nhưng nếu quan trọng của nó đối với bạn, bạn có thể thay thế short với charint với short

+0

Trình biên dịch nào? Bitfield có rất nhiều chi tiết cụ thể về triển khai. –

+0

@CarlNorum đã chỉnh sửa câu hỏi. – user10607

+0

Ngay cả bitfields có được đệm cho căn chỉnh trong quá trình chuyển đổi loại, vì vậy mẫu của bạn không đúng. –

Trả lời

1

Update, sau khi đọc văn bản in context:

Kết quả của ví dụ của bạn (sửa để sử dụng char):

struct bar { 
    unsigned char x:5; 
    unsigned int :0; 
    unsigned char y:7; 
} 

sẽ trông như thế này (giả sử 16-bit int):

char pad pad  int boundary 
    | | |  | 
    v v v  v  
    xxxxx000 00000000 yyyyyyy0 

(Tôi bỏ qua người cuối).

Bitfield không độ dài khiến vị trí di chuyển đến ranh giới int tiếp theo. Bạn đã xác định int thành 16 bit, vì vậy 16 trừ 5 cho 11 bit đệm.

không chèn toàn bộ trống int. Ví dụ trên trang bạn liên kết thể hiện điều này (nhưng sử dụng số nguyên 32 bit).

+0

Đây là liên kết cho ngữ cảnh http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=%2Fcom.ibm.vacpp6m.doc%2Flanguage%2Fref%2Fclrc03defbitf.htm – user10607

+0

Tôi đã làm một số chi tiết đọc và câu trả lời của bạn phù hợp với hình ảnh lớn độc đáo. Cảm ơn! – user10607

-1

Thứ nhất, bất cứ khi nào viết bit lĩnh vực, nó luôn luôn khuyến cáo rằng bạn khai báo biến hoặc tăng dần hoặc giảm dần kích thước của kiểu dữ liệu được sử dụng. Trình biên dịch theo cách này luôn chọn kích thước datatype cao nhất và nó làm cho các khối có cùng kích thước.

Đây là những gì tôi nghĩ sẽ là.

struct address 
| short stops here   short starts 
| |     | 
v v| this is unit  | v    
xxxxx000 00000000 00000000 yyyyyyy0 
+5

Trước tiên, tôi không tin đó là đề xuất hợp lệ * trừ khi * mục tiêu duy nhất của bạn là giảm thiểu không gian. Đôi khi các trường bit được sử dụng để khớp với bố cục được áp đặt bên ngoài. Thứ hai, tôi không tin điều này trả lời câu hỏi. –

Các vấn đề liên quan