bit pattern으로 된 union 선언시 bit order 문제..
글쓴이: vyoz / 작성시간: 화, 2007/01/23 - 4:13오후
typedef union __bt_u{ struct _byte_data{ unsigned char byte; }byte_data; struct __bit_test{ unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; unsigned char b8:1; }bit_test; }bt_u;
이렇게 union을 선언해놓고
bt_u mybt = 0xE0;
이렇게 값을 넣어줬습니다.
제가 기대한것은
b1=1, b2=1, b3=1, b4=0 ... b8=0(순서대로: 1110 0000)으로
셋팅되기를 기대했습니다.하지만 실제로 해보니
b1=0, b2=0 ... b6=1, b7=1, b8=1(순서대로: 0000 0111)으로
셋팅이됩니다. cx86202이란 arm 계열 cpu+linux 환경과
intel cpu+windows(VC++) 환경에서 테스트해봤는데 둘 다 같은 결과를 보여줍니다.
왜 그런걸까요?
Forums:
비트가 할당되는
비트가 할당되는 방법은 구현체에 의존적입니다.
원하시는 대로 매핑이 되어야 한다면 비트 연산자를 쓰십시요.
8비트 값이기에
8비트 값이기에 엔디안이 어떻든간에 같은 결과를 돌려 주는 것이 논리적으로 맞아 보입니다만...

그리고 16비트나 32비트에서도 아마 같은 결과가 나오지 않을까 싶네요.
structure도 위에 선언된 변수보다 아래 선언된 변수가 메모리 위치/주소 상 뒤에 위치할테니까요.
32bit도 같습니다.
이런식으로 bt_u mydata = fourbyte = 0x0000E000; 넣어주면 32bit 단위로 bit order가 바뀝니다.
제가 생각할땐
0000(0) 0000(0) 0000(0) 0000(0) 1110(E) 0000(0) 0000(0) 0000(0)
이런 순서로 들어가있어야 한다고 생각했는데 실제로 b1 ~ b32까지 출력을 해보면
0000(0) 0000(0) 0000(0) 0111(7) 0000(0) 0000(0) 0000(0) 0000(0)
로 순서가 바뀝니다.
로 넣을경우 8bit씩 bit order가 역순이됩니다.
왜 이럴까요? 으...
Byte-ordering & Bit-ordering
말 그대로 Little과 Big의 의미를 잘 생각해 보면 그 차이를 알 수 있습니다.
Little은 LSB부터.. Big은 MSB부터.. 따라서 Bit-struct를 선언하실때
Little인 경우는 LSB부터 선언해 주셔야 합니다.
[irondog 씀]
그렇지 않습니다. Byte-ordering이 1바이트 내에서는 Little과 Big이 동일하다는 것이지
Bit-ordering이 동일하다는 것이 아닙니다.
[vyoz 씀]
만약 상기코드를 다음과 같이 하면 어떻게 될까요??
직접 해 보시면 Byte-ordering 및 Bit-ordering에 대한 차이 및 이해를
확실히 할 수 있을 것입니다.
댓글 달기