30/09/2018, 16:37

Hỏi về bit fields trong Struct

Trong khi tìm cách viết hàm chuyển số thập phân sang IEEE thì em có đọc tham khảo về phần khai báo struct sử dụng bit fields. Nhưng khi mày mò một lát thì lại không hiểu lắm, cụ thể trong code thì kết quả in ra là -7 ( 1001 chuyển qua thập phân là -7 thì khá hợp lí ) và 121 ( cái này em đang rối ) . Các anh có thể giải thích hộ em được không ạ ! Cảm ơn mấy anh nhiều .

struct bitFields
{
	int bit_0 : 1;
	int bit_1_to_4 : 4;
	int bit_5 : 1;
	int bit_6_to_13 : 8;
};
int _tmain(int argc, _TCHAR* argv[])
{
	bitFields a;
	a.bit_1_to_4 = 1001;
	a.bit_6_to_13 = 10011001;
	printf("%d
",a.bit_1_to_4);
	printf("%d
",a.bit_6_to_13);
	return 0;
}
Nguyễn Minh Dũng viết 18:45 ngày 30/09/2018

Trước hết struct này không chuẩn, nó thiếu bit. 1 + 4 + 1 + 8 = 14 bits tức là thiếu 2 bits để đủ 16 bits tức 2 bytes

struct bitFields
{
	int bit_0 : 1;
	int bit_1_to_4 : 4;
	int bit_5 : 1;
	int bit_6_to_13 : 8;
};

Tiếp theo, khi em viết a.bit_1_to_4 = 1001; thì em nghĩ 1001 là nhị phân, như C compiler nó nghĩ đây là số 1001 trong hệ thập phân tức là tương đương với 0b1111101001.

Em sửa lại bằng cách thêm tiền tố 0b vào phía trước các số này. Lưu ý là tiền tố 0b không chuẩn. Có compiler hỗ trợ, có compiler không. Hoặc có thể thay 1001 bằng số 9 trong hệ thập phân.

Bài liên quan
0