구조물 선언의 결장은 다음과 같은 의미가 무엇입니까? 1, : 7, : 16 또는 : 32?

StackOverflow https://stackoverflow.com/questions/1604968

  •  05-07-2019
  •  | 
  •  

문제

다음 C ++ 코드는 무엇을 의미합니까?

unsigned char a : 1; 
unsigned char b : 7;

나는 그것이 두 개의 char a와 b를 생성한다고 생각합니다. 둘 다 길이가 1 바이트가되어야하지만 ": 1"과 ": 7"부분이 무엇을하는지 전혀 모른다.

도움이 되었습니까?

해결책

1과 7은 값의 범위를 제한하는 비트 크기입니다. 그들은 일반적으로 구조와 노조에서 발견됩니다. 예를 들어, 일부 시스템에서는 다음과 같습니다 char 너비 및 포장 규칙 등), 코드 :

typedef struct {
    unsigned char a : 1;
    unsigned char b : 7;
} tOneAndSevenBits;

8 비트 값을 생성합니다 a 그리고 7 비트 b.

8 비트 숯의 상단 절반에 포함될 수있는 4 비트 나이 블과 같은 "압축 된"값에 액세스하기 위해 C에 일반적으로 사용됩니다.

typedef struct {
    unsigned char leftFour  : 4;
    unsigned char rightFour : 4;
} tTwoNybbles;

우리 사이의 언어 변호사의 경우, C ++ 11 표준의 9.6 섹션은 이것을 자세히 설명하고 약간 역설적으로 설명합니다.


비트 필드 [class.bit

양식의 회원 선고기

     식별자고르다속성 사례고르다   :   일정한 표현

비트 필드를 지정합니다. 길이는 결장에 의해 비트 필드 이름에서 시작됩니다. 선택 사항 속성 사례 선언 된 실체에 적용됩니다. 비트 필드 속성은 클래스 멤버 유형의 일부가 아닙니다.

그만큼 일정한 표현 0보다 큰 값을 가진 필수 상수 표현이어야합니다. 적분 상수 표현의 값은 비트 필드 유형의 객체 표현에서 비트 수보다 클 수 있습니다. 이러한 경우 추가 비트는 패딩 비트로 사용되며 비트 필드의 값 표현에 참여하지 않습니다.

클래스 객체 내에서 비트 필드 할당은 구현 정의됩니다. 비트 필드의 정렬은 구현 정의됩니다. 비트 필드는 일부 주소 가능한 할당 장치로 포장됩니다.

메모: 비트 필드는 일부 기계가 아닌 일부 머신에있는 할당 장치를 스 트래드 할당 장치로 가득 채 웁니다. 비트 필드는 일부 기계에 오른쪽에서 왼쪽으로 할당되며 다른 기계에서 왼쪽에서 오른쪽으로 할당됩니다. - 끝 참고

다른 팁

나는 그것들이 비트 필드 일 것이라고 믿는다.

엄밀히 말하면, 비트 필드는 int, signiped int 또는 _bool이어야합니다. 대부분의 컴파일러는 모든 통합 유형을 취합니다.

참조 C11 6.7.2.1 :

비트 필드에는 자격을 갖추거나 자격이없는 _bool, 서명 된 int, 서명되지 않은 INT 또는 기타 구현 정의 유형의 유형이 있어야합니다.

컴파일러는 아마도 1 바이트의 스토리지를 할당 할 것이지만 더 많이 잡을 수 있습니다.

참조 C11 6.7.2.1 :

구현은 비트 필드를 유지하기에 충분히 큰 주소가 가능한 저장 장치를 할당 할 수 있습니다.

저축은 여러 번 선언 된 여러 비트 필드가있을 때 발생합니다. 이 경우 할당 된 스토리지는 가능하면 포장됩니다.

참조 C11 6.7.2.1 :

충분한 공간이 남아있는 경우, 구조물의 다른 비트 필드를 즉시 따르는 비트 필드는 동일한 장치의 인접한 비트로 포장되어야합니다. 공간이 충분하지 않은 경우, 맞지 않는 비트 필드가 다음 장치에 넣거나 인접한 단위가 겹치는지 여부는 구현 정의됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top