[완료]이게 도대체 어떤 구문인가요?

parrier의 이미지

struct baby
{
uint8 Ams:4;
uint8 Que:4;
uint8 Box;
};

이런 괴상한 구문을 보았습니다.
Mask라는 개념이 들어가는 것 같은데, 이것이 C 구문 맞나요?
아니면.. C++인가요?

처음보는 구문이라 생소하네요. 이것이 뭔지, 왜 쓰이는지 아시는 분은
답변 좀 부탁드려요.

seungrye의 이미지

제가 알기론 비트필드 입니다.

더 알려드리고 싶지만.. 저도 이름(비트필드)만 알고, 실 사용법이나 사용용도는 잘 모릅니다.-.-;

:4
:4
4비트 + 4비트 하면 8비트 = 1바이트 죠 : )

sizeof(baby) == 2byte

nouveou의 이미지

비트필드라고 합니다.
구조체는 특정 수의 비트로 구성된 멤버를 가질 수 있습니다. 이걸 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값을 표현할때 유용하게 사용할 수있습니다.

그리고 비트필드는 포인터값으로 메모리에 접근할수 있는 최소단위인 바이트보다 작을 수 있기 때문에 비트필드를 가리키는 포인터는 존재하지 않습니다

mauri의 이미지

장치제어나 통신을 할때, 어떤 데이터를 주고받을까 서로 결정을 하게 되지요?

예로 특정 장치와 데이터를 주고 받는데, 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비트와 관계없이 상태코드 취득이 가능하니까요.

그럼.. 즐프되셔요 __);

parrier의 이미지

의미부터 용도까지, 자세한 답변 정말 감사합니다^_^

-_-v

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.