2013-07-13 5 views
6
#include<stdio.h> 
    struct a 
    { 
     int a:4; 
    }; 
    main(){ 
    struct a aa; 
    aa.a=9; 
    printf("a=%d\n",aa.a); 
    return 0; 
    } 

출력은 -7입니다. 왜 그래야만하지? 정확하게 int : 4는 무엇을합니까? 설명해주십시오.구조에 int가있는 비트 사용

답변

5

을합니다. a:4을 쓰면 4 비트의 메모리 만 할당 할 수 있습니다. 실제로는 3 비트 남았습니다. 그래서 우리의 유효 범위는 [-8,7]입니다. 1이 모두 -1이므로 부정적인면에 여분의 숫자가 있습니다. 이에 대한 자세한 설명은 위의 링크를 참조하십시오.

9 (부호없는) 이진수는 1001입니다. 이것을 a (signed)에 넣으면 a은 처음 1부터 부정적이며, 다음 숫자는 001이므로 최대 음수에 1을 더하면 -7이됩니다.

숫자 9를 4 비트로 저장하려면 [0, 15]의 범위를 제공하는 unsigned int을 사용해야합니다.

편집

:
경우 사람이 1001 서명하는 방법을 알아내는으로 어려움을 겪고 우리를 -7 제공, 다음 사항을 고려하십시오

-1 1111 때문에, 몇 가지 변수 value = -1을 할 수 있습니다. 음의 값을 알아 내기 위해

(부호) int num, num에 난을 에게 X 우리 나타낸다하자 :

X I {0,1 I = 0 인 위치 I에서 최하위 비트)}, 그 다음

모든 X I = 0, 2 value I 빼기.

예 :

1001 :

value = -1 - 2 -2 2 = -7

당신이 부호 참 INT 사용할 필요가
+0

비트 필드의'int'는 기본적으로'unsigned int'입니다. OP의 경우에는 나타나지 않지만 문서를 읽는 것은 결코 아프지 않습니다. –

+0

좋은 질문과 아주 좋은 대답! 서명되지 않은 유형이 예상 답변을 제공하는지 확인했습니다. – lsk

+0

@ user1930928 감사합니다. :) –

3

필드에 4 비트를 예약 했으므로 기호에 1 비트만 사용되므로 양수 값으로 3 비트 만 남습니다. 따라서 최대 7 개의 값만 저장할 수 있습니다.

+2

이 유 진 표현을 사용하여 설명하십시오 수 있을까? –

+0

@RajaNarayan이 내 대답을 확인합니다. –

+0

@SteveP. 설명 주셔서 감사합니다! –

4

필드는 4 비트 부호있는 정수입니다. 부호있는 정수의 경우 상위 비트는 부호 비트이므로 실제 숫자는 3 비트입니다. 필드에 저장할 수있는 숫자의 범위는 -8에서 7까지입니다 (2의 칭찬 저장소라고 가정).

9의 비트 패턴은 1001이며, 네 번째 비트가 설정되어 음수로 해석되므로 -7로 인쇄됩니다. -1이라고 예상했다면, 2's compliment에서 읽어야합니다. 당신이 분야에서 9를 저장할 수 있도록하려면이 최상위 비트가 부호에 사용되며, two's complement 이래로

, aunsigned int

2

:

#include<stdio.h> 
struct a 
{ 
    unsigned a:4; // <-- unsigned indeed int, then work good 
}; 
main(){ 
struct a aa; 
aa.a=9; 
printf("a=%d\n",aa.a); 
return 0; 
} 

출력 :

a=9