#include <stdio.h> struct Flags { union { // 익명 공용체 struct { // 익명 구조체 unsigned short a : 3; // a는 3비트 크기 unsigned short b : 2; // b는 2비트 크기 unsigned short c : 7; // c는 7비트 크기 unsigned short d : 4; // d는 4비트 크기 }; // 합계 16비트 unsigned short e; // 2바이트(16비트) }; }; int main() { struct Flags f1 = { 0, }; // 모든 멤버를 0으로 초기화 f1.a = 4; // 4: 0000 0100 f1.b = 2; // 2: 0000 0010 f1.c = 80; // 80: 0101 0000 f1.d = 15; // 15: 0000 1111 printf("%u\n", f1.e); // 64020: 1111 1010000 10 100 return 0; }이 코드에서 보면 printf("%u\n", f1.e); 에서 비트는 작은거부터 나열되니까
1010000 1111 100 10 로 나열되야하는거 아닌가요? 잘 이해가 안돼서 질문드립니다
조금 오해의 소지가 있는 것 같습니다.
비트 필드는 선언된 순서로 배치됩니다.
a, b, c, d 순서로 선언되었으니 비트는 a, b, c, d 순서로 배치됩니다.
사람이면 a, b, c, d 순서로 채워갈 것입니다.
left -> right
왼쪽에서 오른쪽으로 비트를 a, b, c, d로 채워갈 것입니다.
그런데 보통의 x86 CPU, 인텔 CPU는 오른쪽에서 왼쪽으로 비트를 채워갑니다.
left <- right
이 방향으로 비트를 채워갑니다.
그림 56-2를 보면 비트 순서가 오른쪽 끝에 0으로 적혀 있고, 왼쪽 끝에 31로 적혀 있습니다.
따라서 비트에 채워지는 순서는
a를 가장 오른쪽에 채우고
다시 a 옆 가장 오른쪽에 b를 채우니
배치 순서는
b a
가 되고
다시 오른쪽에 c를 채우니
c b a
가 되고
다시 오른쪽에 d를 채우니
d c b a
가 됩니다.
LSB(Least Significant Byte)부터 채워갑니다.
스마트폰에 쓰이는 ARM 프로세서는 MSB(Most Significant Byte)부터 채우므로 그 반대가 됩니다. 즉
a b c d
순서로 채워집니다.
즉, 비트 배열 그림에서 하단에 31로 쓰여진 32번째 비트부터 비트를 채워갑니다.
x86 프로세서와 ARM 프로세서는 다릅니다.
책은 ARM, 임베디드 프로그래머가 대상이 아닌 입문자 대상이므로 보편적인 x86 프로세서를 기준으로 설명되어 있습니다.
맥, 리눅스, 윈도 환경이고, 인텔 또는 AMD CPU를 사용하는 PC라면 LSB, 최하위 비트부터 채워지는 게 맞습니다.