2

임 비트 필드의 동작에 대해 좀 더 이해하려고 노력 중입니다.C에서 비트 필드를 포함하는 구조 초기화하기

다음 코드를 감안할 때 : 를 그리고 가정 INT가 32 비트

#include <stdio.h> 

int main() 
{ 
    struct byte 
    { 
     int one:1; 
    }; 
    struct byte var = {3}; 
    printf("%d\n", var.one); 
    printf("%#x\n", var); 
    return 0; 
} 

내가 얻을 출력은이 :

 
-1 
0x1 

그러나 내가보기 위해 기다리고 있었다 :

 
-1 
0x3 

이후

struct byte var = {3}; 

은 int의 4 바이트에 값 3을 할당합니다. 그렇지 않습니까?

실제로 위 코드 줄이 1 비트 필드에 값 3을 저장하려고 시도하는 것처럼 보입니다. 따라서 0x1을 두 번째 출력 줄로 인쇄하십시오.

그래서 제 질문은 다음과 같습니다

방법은 전체 구조에 이러한 초기화와 할당이 작동합니까?

또한 {}은 왜 필요합니까? 이와

+4

왜 그렇게 생각하십니까? 할당 할 1 비트 너비의 필드가 있습니다. 컴파일러는 여분의 비트를 유지할 의무가 없습니다. –

+0

@JonathanGrynspan 그것을 지적 해 주셔서 감사합니다. 그러나 컴파일러가 나머지 비트를 무시할 경우 각 비트 필드의 형식을 지정해야하는 이유는 무엇입니까? – pablorg

+0

'struct byte {TYPE var : 1; };'(unsigned) int/char'와 다른 타입을 사용합니다. 아마도 당신은 차이점을 발견 할 것입니다. –

답변

4
int one:1; 

, 당신은 sign 비트에 사용되는 단 하나의 비트와 int를 선언합니다. 그러면 -1이 표시됩니다.

3 (011)을 저장하려면 총 2 (데이터) +1 (부호) 비트가 있어야합니다. 따라서 다음과 같아야합니다.

struct byte 
{ 
int one:3; 
}; 

또는 부호없는 int를 사용하십시오.

struct byte 
{ 
unsigned int one:2; 
}; 
+0

답장을 보내 주셔서 감사합니다. 어쩌면 당신은 나를 위해 뭔가를 화나게 할 수 있습니다. 컴파일러가 사용되지 않는 비트를 무시할 경우 각 비트 필드의 유형을 지정하는 시점은 무엇입니까? – pablorg

+0

할당 된 하나의 비트를 요청했습니다. 그 이상을 넘기면 여분의 정보 비트를 무시합니다. –

+0

그래서 비트 필드에 어떤 유형을 사용하는지에 차이가 있습니까? – pablorg

관련 문제