2010-10-19 25 views

Trả lời

5

lĩnh vực Char chút làm việc trong cùng một cách như int, chỉ cần loại cơ bản là 8-bit rộng, không 32-bit. Vì vậy, bạn sẽ nhận được một số liệu thống kê struct, trong đó có kích thước của 1 byte, và 3 biến thành viên, chiếm tổng cộng 4 bit.

+0

ok, tôi cảm ơn. –

+1

@Tommy: bạn nên thực sự cẩn thận với 'char' ở đây vì đây không phải là xách tay và họ có sự mơ hồ rằng họ có thể được ký hoặc loại unsigned. Nếu bạn có thể, tránh điều này và sử dụng 'unsigned' hoặc' _Bool'. Hai bit của một 'unsigned' cần chính xác nhiều không gian như hai bit của một' char' ;-) –

+1

Chưa kể bạn nên tránh bitfields để bắt đầu. –

2

nó chỉ xác định kích thước của biến mà bạn sẽ sử dụng.

char 
int 

này không được hỗ trợ theo tiêu chuẩn (sử dụng điển hình là unsigned int), nhưng đó là một nỗ lực đẹp :)

lại: truy vấn của bạn, đó là một nỗ lực của đơn vị thực hiện để sử dụng ít bộ nhớ cho họ bitfields (char như trái ngược với int unsigned)

Bên cạnh đó, từ Atmel, chúng tôi nhận được:

trong tiêu chuẩn C, chỉ có “unsigned (int) ”và“ int ”được chấp nhận là kiểu dữ liệu cho một thành viên bitfield. Một số trình biên dịch cho phép “unsigned char” ........

+0

giá trị có thể có cho char 1 bit là bao nhiêu? –

+1

nó không phải là một bit char, nó là một bit bên trong char char – KevinDTimm

+2

char là một byte trong kích thước, do đó, nó có giá trị -128 đến 127 (đã ký) hoặc 0 đến 255 (unsigned). Nếu bạn muốn sử dụng nó như một trường bit, bạn cần sử dụng các mặt nạ và các toán tử bitwise | &^~ << and >> – Tristan

5

Các trường bit phải được khai báo theo loại signed int, unsigned int hoặc bool từ <stdbool.h>. Các loại khác có thể hoặc có thể không hợp pháp (tùy thuộc vào nền tảng), nhưng hãy cẩn thận về việc ký kết - đồng bằng int có thể được thực hiện để không được ký cho một bitfield.

Điều đó nói rằng, nó có thể là một gợi ý cho trình biên dịch rằng sự liên kết của struct phải là 1 và không sizeof(int). Và trình biên dịch được phép chấp nhận char và gán cho nó ý nghĩa như vậy.

Theo C99 6.7.2.1/9,

A-trường bit được hiểu như là một loại nguyên ký kết hoặc unsigned gồm số quy định của bit. Nếu giá trị 0 hoặc 1 được lưu trữ vào một trường bit có độ rộng không kiểu _Bool, giá trị của trường bit sẽ được so sánh bằng giá trị được lưu trữ.

và một chú thích:

Như quy định tại 6.7.2 ở trên, nếu Bộ xác định kiểu thực tế sử dụng là int hay một typedef tên định nghĩa là int, sau đó nó là thực hiện xác định liệu các bit -field được ký hoặc chưa ký.

+3

C99 nói rõ ràng trong 6.7.2.1/4 "_Bool, ký int, unsigned int, hoặc một số loại thực hiện được xác định khác". Có lẽ việc triển khai thực hiện tự do để xác định liệu đối tượng vùng chứa bit có thực sự nhỏ như một 'char' đơn lẻ như nó xuất hiện trong trường hợp này hay không. – RBerteig

+1

@RBerteig: Tôi có nói điều gì đó mâu thuẫn không? – Potatoswatter

+1

Xin lỗi, tôi dường như đã đọc "Các loại khác có thể hoặc có thể không hợp pháp ..." là không thực sự nói "triển khai được xác định". (Lý do duy nhất của tôi là ngâm trong tiêu chuẩn với không đủ caffeine.) Tôi không thể tìm thấy bất kỳ câu trả lời rõ ràng từ tiêu chuẩn về những gì 'sizeof()' nên nói trong trường hợp này, tuy nhiên. – RBerteig

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