비트필드라고 합니다.
구조체는 특정 수의 비트로 구성된 멤버를 가질 수 있습니다. 이걸 bit-field라고 합니다.
struct baby
{
uint8 Ams:4;
uint8 Que:4;
uint8 Box;
};
Ams:4는 uint8이 아마 unsigned char형을 의미하는거 같은데 .. 4bit만 쓴다는 것입니다.
위 님 말씀대로 구조체의 크기는 2byte가 되겠지요
signed로 선언된 비트필드에서 비트 하나는 부호 비트입니다.
그러므로 Ams는 0 부터 (2^4)까지 표현할수 있습니다.
비트 필드는 메모리를 효율적으로 사용할때 표현되거나 boolean값을 표현할때 유용하게 사용할 수있습니다.
그리고 비트필드는 포인터값으로 메모리에 접근할수 있는 최소단위인 바이트보다 작을 수 있기 때문에 비트필드를 가리키는 포인터는 존재하지 않습니다
비트필드라고 하는걸 겁니다.;
제가 알기론 비트필드 입니다.
더 알려드리고 싶지만.. 저도 이름(비트필드)만 알고, 실 사용법이나 사용용도는 잘 모릅니다.-.-;
:4
:4
4비트 + 4비트 하면 8비트 = 1바이트 죠 : )
sizeof(baby) == 2byte
비트필드 입니다
비트필드라고 합니다.
구조체는 특정 수의 비트로 구성된 멤버를 가질 수 있습니다. 이걸 bit-field라고 합니다.
struct baby
{
uint8 Ams:4;
uint8 Que:4;
uint8 Box;
};
Ams:4는 uint8이 아마 unsigned char형을 의미하는거 같은데 .. 4bit만 쓴다는 것입니다.
위 님 말씀대로 구조체의 크기는 2byte가 되겠지요
signed로 선언된 비트필드에서 비트 하나는 부호 비트입니다.
그러므로 Ams는 0 부터 (2^4)까지 표현할수 있습니다.
비트 필드는 메모리를 효율적으로 사용할때 표현되거나 boolean값을 표현할때 유용하게 사용할 수있습니다.
그리고 비트필드는 포인터값으로 메모리에 접근할수 있는 최소단위인 바이트보다 작을 수 있기 때문에 비트필드를 가리키는 포인터는 존재하지 않습니다
통신에 곧잘 사용되거나 합니다.
장치제어나 통신을 할때, 어떤 데이터를 주고받을까 서로 결정을 하게 되지요?
예로 특정 장치와 데이터를 주고 받는데, 4바이트의 어쩌고 데이터와, 4바이트의 저쩌고 데이터, 1바이트의 장치상태라는 것을 한 패킷으로 받자라고 결정을 했습니다.
그렇다면 다음과 같은 구조체를 선언해서 데이터를 받으면 될 것입니다.
struct stPacket {
UINT 어쩌고;
UINT 저쩌고;
BYTE 장치상태;
}
받은 패킷에서 장치상태를 보고싶다면 stPacket.장치상태 하면 되는 것이지요?
그런데 장치상태의 1바이트중 상위 1비트는 오류 유무, 나머지 7비트는 상태코드라고 합니다. 그럼...
오류유무 | 상태코드
stPacket.장치상태(1바이트) = [7] [6][5][4][3][2][1][0] (8비트) <-이렇게 됩니다.
이 경우 오류나 아니냐를 판단하기 위해서는 비트 연산을 해야 되는데..
#define EQUIP_ERR_FLAG 0x80 // 100000000(2진수)
if( 장치상태 & EQUIP_ERR_FLAG ) {
// 오류
}
이렇게 연산을 해야 하는 것이지요.
하지만 혹시 장치상태가..
struct stEquipStatus {
BYTE byErr : 1;
BYTE byStatus : 7;
}
이렇게 구성이 되어 있다면
if( stPacket.장치상태.byErr == TRUE ) {
// 오류
}
이런것이 가능하게 됩니다.
알수없는 EQUIP_ERR_FLAG 라는 정의보다 stPacket.장치상태.byErr가 좀더 명시적이라고 봅니다.
상태코드 취득하기도 쉽겠지요?
stPacket.장치상태.byStatus면 에러코드 상위 1비트와 관계없이 상태코드 취득이 가능하니까요.
그럼.. 즐프되셔요 __);
자세한 답변 정말감사합니다.
의미부터 용도까지, 자세한 답변 정말 감사합니다^_^
-_-v
댓글 달기