2013-09-01 2 views
3

다음 C 코드가 있습니다. 구조체 - 출력을 설명하십시오 :

struct values{ 
    int a:3; 
    int b:3; 
    int c:2; 
}; 

void main(){ 
    struct values v={2,-6,5}; 
    printf("%d %d %d",v.a,v.b,v.c); 
} 

내가 코드를 실행

, 나는 다음과 같은 출력을 얻고있다 :

2 2 1. 

그러나 출력이 오른쪽 2 -6 5해야 하는가?

내가 잘못하면 설명해주십시오.

+4

비트 필드에 익숙합니까? (: 3 등) – doctorlove

+1

OS X의 Clang 컴파일러는 나에게 멋진 경고를줍니다 : * "int에서 bitfield 로의 암시적인 절사는 -6에서 2 [-Wconstant-conversion]"값을 변경합니다. –

답변

1

No. 출력은 2 2 1입니다.

C 컴파일러는 값을 이진수로 변환하고 메모리에 저장합니다.

이진 값 : 00000010

10-6

이진 값 : 11111010 (11,111,001 + 1)

5

이진 값 : 00000101

메모리에 저장 중 :

들어 2, 010이 저장됩니다.

-6의 경우 010이 저장됩니다.

5의 경우 01이 저장됩니다.

주 방법에서 이러한 변수에 액세스하면 v.a에 대해 "010"이 반환됩니다. 여기에서 대부분의 비트는 부호 용입니다.

그래서 v.a는 2. 마찬가지로 2 v.b하고 v.c 1.

가 도움이 희망입니다.

5

-6은 3 비트 부호있는 정수의 범위를 초과합니다. 따라서 이 정의되지 않은 구현 정의 동작 (실제로는 값의 최상위 비트가 버려짐)이라는 아티팩트를 관찰하고 있습니다.

+0

예 그러나 구현 정의 동작 (c99, 6.3.1.3p3)이 정의되지 않았습니다. – ouah

+0

@ouah : 감사합니다 ... .. –

4
{2,    | -6,    |  5  } 
010 last 3 bits | 010 last 3 bits | 01 last 2 bits 
2     2      1  
+0

이 대답에 대해 조금 자세히 설명해주십시오. – Strawberry

+0

@Strawberry 죄송합니다. – P0W

+1

@ P0W 단순히 대답을보고 있었지만 투표 할 기분이 아니었지만 설명을보고 난 후에도 저항 할 수 없었습니다 ... 그러나 무엇인가를 이해할 경우를 제외하고는 모든 것을 설명합니다 .. +1 :) 그리고 다른 사람들도 : 피 – 0decimal0

관련 문제