2013-11-22 2 views
0

저는 현재 C 프로그래밍 문제를 해결하고 배치를 준비 중입니다. 내 코드 :C 프로그램의 출력 찾기

#include<stdio.h> 

int main() 
{ 
    struct value 
    { 
     int bit1:1; 
     int bit3:4; 
     int bit4:4; 
    }bit={1, 2, 13}; 

    printf("%d, %d, %d\n", bit.bit1, bit.bit3, bit.bit4); 
    return 0; 
} 

이 구조체에 붙어 있습니다. 대답은 다음과 같을 것이라고 생각 : 1,4,4 출력은 -1,2,3 -이 질문에 대해 설명해주십시오. 감사합니다. .

[Warning] overflow in implicit constant conversion [-Woverflow] 

을하고 출력으로

-1,2,-3 

을 받고 그 이유는 다음과 같습니다 컴파일에

+2

여기에 조합이 없습니다 ... 왜 1,4,4를 기대합니까? – Chowlett

+0

죄송합니다. @ Chowlett, 편집했습니다. –

+1

'union'은 정의상'struct'와 매우 유사하지만 구현이 매우 다릅니다! –

답변

2

그것은 생성된다.
참고 : 항상 디버거를 사용하고 프로그램을 디버깅하십시오.

2

이는 비트 필드의 값을 제공합니다 :

struct value 
{ 
    unsigned int bit1:1; 
    unsigned int bit3:4; 
    unsigned int bit4:4; 
}bit={1, 2, 13}; 

printf("%d, %d, %d\n", bit.bit1, bit.bit3, bit.bit4); 

을 비트 필드의 폭을 받고,이 수 없습니다 ...

3

는 당신이 관찰하는 것은 부호 확장 암시 적 정수 변환입니다 . 부호가있는 더 작은 정수 유형에서 더 긴 정수 유형으로 변환 할 때 컴파일러는 부호 확장 변환을 사용합니다. 나는. 선행 비트는 더 작은 유형의 최상위 비트로 채워집니다.

사용자의 비트 필드 bit1에는 1 비트만 있습니다. 1으로 설정하면 가장 중요한 비트가 설정되고 int으로 부호 확장 변환은 (int)0xFFFFFFFF == -1이됩니다.

bit4과 동일하며 4 비트이며 13 == 0xD으로 초기화됩니다. 또한 가장 중요한 비트가 설정되어 있습니다. (int)0xFFFFFFFD == -3으로 확장되었습니다. 1 : 4 : 4 컴파일러를 혼란 unsigned int는 다음 제로 확장 정수 변환을 얻을 것이다 출력

1, 2, 13 
1

을 관찰하므로

당신은 당신의 비트 필드를 선언합니다. 다음은 구조에 대한 빠른 링크입니다.

http://en.wikipedia.org/wiki/Struct_(C_programming_language)

클리너 프로그래밍 스타일은 별도의 구조를 정의하고 다른 전화를 인스턴스화하는 것입니다.

/* 
    simple1.c - a program to demonstrate c structures. 
*/ 

// Standard libraries 
#include <stdio.h> 

int main() 
{ 
    // Definition 
    struct value 
    { 
     int bit1; 
     int bit3; 
     int bit4; 
    }; 

    // Instantiation 
    struct value bit = {1, 2, 13}; 

    // Usage 
    printf("%d, %d, %d\n", bit.bit1, bit.bit3, bit.bit4); 

    // All done 
    return 0; 
}