2010-06-01 28 views
52

thể trùng lặp:
What does this C++ code mean?'Nhiệt độ chưa được ký: 3' trong cấu trúc hoặc công đoàn nghĩa là gì?

Tôi đang cố gắng để ánh xạ một cấu trúc C đến Java sử dụng JNA. Tôi bắt gặp một thứ mà tôi chưa bao giờ thấy.

Định nghĩa struct là như sau:

struct op 
{ 
    unsigned op_type:9; //---> what does this mean? 
    unsigned op_opt:1; 
    unsigned op_latefree:1; 
    unsigned op_latefreed:1; 
    unsigned op_attached:1; 
    unsigned op_spare:3; 
    U8 op_flags; 
    U8 op_private; 
}; 

Bạn có thể thấy một số biến được định nghĩa như thế unsigned op_attached:1 và tôi không chắc chắn những gì sẽ có nghĩa là gì. Điều đó có ảnh hưởng đến số lượng byte được phân bổ cho biến cụ thể này không?

+1

Chà, điều đó hoàn toàn mới đối với tôi. Nice tìm! –

+4

Đã thêm 'dấu hai chấm' để giúp nó xuất hiện trong tìm kiếm. –

+0

Điều tốt nhất bạn có thể làm với các trường bit là tránh chúng. Sử dụng mặt nạ và dịch chuyển tốt hơn để truy cập các nhóm bit theo các số nguyên theo cách được xác định rõ. – starblue

Trả lời

39

Cấu trúc này chỉ định độ dài tính bằng bit cho từng trường.

Lợi thế của việc này là bạn có thể kiểm soát sizeof(op), nếu bạn cẩn thận. kích thước của cấu trúc sẽ là tổng của các kích thước của các trường bên trong.

Trong trường hợp của bạn, kích thước của op là 32 bit (nghĩa là, sizeof(op) là 4).

Kích thước luôn được làm tròn thành bội số tiếp theo là 8 cho mỗi nhóm không dấu xxx: yy; xây dựng.

Điều đó có nghĩa:

struct A 
{ 
    unsigned a: 4; // 4 bits 
    unsigned b: 4; // +4 bits, same group, (4+4 is rounded to 8 bits) 
    unsigned char c; // +8 bits 
}; 
//     sizeof(A) = 2 (16 bits) 

struct B 
{ 
    unsigned a: 4; // 4 bits 
    unsigned b: 1; // +1 bit, same group, (4+1 is rounded to 8 bits) 
    unsigned char c; // +8 bits 
    unsigned d: 7; // + 7 bits 
}; 
//     sizeof(B) = 3 (4+1 rounded to 8 + 8 + 7 = 23, rounded to 24) 

Tôi không chắc tôi nhớ này một cách chính xác, nhưng tôi nghĩ rằng tôi đã nhận nó đúng.

+11

Hãy nhớ rằng trẻ em! các trường bit phụ thuộc vào trình biên dịch, không có chuẩn C/C++ cho rằng các bit 4 bit đầu tiên phải được sử dụng trên a: 4 ở trên. –

+1

Giả sử 8 bit trên mỗi byte. – Ferruccio

+1

Giả sử 8 bit trên mỗi byte là an toàn. Giả sử trình biên dịch sẽ không sử dụng các bit đệm hoặc có một thứ tự byte cụ thể, tuy nhiên, không phải. – starturtle

19

Nó khai báo bit field; số sau dấu hai chấm cho độ dài của trường theo bit (nghĩa là số bit được sử dụng để biểu diễn nó).

4

Công cụ sửa đổi dấu hai chấm trên các loại tích phân xác định số lượng bit int nên chiếm.

6
unsigned op_type:9; 

Phương tiện op_type là biến số nguyên với 9 bit.

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