#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가있는 비트 사용
#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가있는 비트 사용
을합니다. 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, 2value
I 빼기.
예 :
1001
:
value
= -1 - 2 -2 2 = -7
필드에 4 비트를 예약 했으므로 기호에 1 비트만 사용되므로 양수 값으로 3 비트 만 남습니다. 따라서 최대 7 개의 값만 저장할 수 있습니다.
이 유 진 표현을 사용하여 설명하십시오 수 있을까? –
@RajaNarayan이 내 대답을 확인합니다. –
@SteveP. 설명 주셔서 감사합니다! –
필드는 4 비트 부호있는 정수입니다. 부호있는 정수의 경우 상위 비트는 부호 비트이므로 실제 숫자는 3 비트입니다. 필드에 저장할 수있는 숫자의 범위는 -8에서 7까지입니다 (2의 칭찬 저장소라고 가정).
9의 비트 패턴은 1001이며, 네 번째 비트가 설정되어 음수로 해석되므로 -7로 인쇄됩니다. -1이라고 예상했다면, 2's compliment에서 읽어야합니다. 당신이 분야에서 9를 저장할 수 있도록하려면이 최상위 비트가 부호에 사용되며, two's complement 이래로
, a
unsigned int
:
#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
비트 필드의'int'는 기본적으로'unsigned int'입니다. OP의 경우에는 나타나지 않지만 문서를 읽는 것은 결코 아프지 않습니다. –
좋은 질문과 아주 좋은 대답! 서명되지 않은 유형이 예상 답변을 제공하는지 확인했습니다. – lsk
@ user1930928 감사합니다. :) –