2017-01-31 8 views
3

가 현재 나는 내가 예를 준 구조와 여기 INT 서명에 대한 C 작업과 혼란에 직면하고있다 : 여기서명 INT하지만 혼란

#include <stdio.h> 
#include <string.h> 

struct { 
    signed int age : 4; 
} Age; 

int main() { 

    Age.age = -8; 
    printf("Age.age : %d\n", Age.age); 

    return 0; 
} 

을 이미 크기를 설명했다 값을 저장하는 동안 int가 차지할 비트 수. 여기에 저는 나이에 가치 -8을 할당하고 있습니다. 그래서 그것은 8에 대해 1000과 같은 값을 저장하고 -8에 대해서는 왼쪽 첫 비트가 부호 비트로 알려진 11000과 같이 저장해야합니다. 따라서 int age가 -8을 저장해야한다면 5 비트가 있어야하지만 주어진 예제를 컴파일하는 동안 오류가 발생하지 않고 출력을 표시합니다.

제 문제를 해결해주세요.

+0

왜 서명해야합니까? bitfields는 unsigned로 더 쉽습니다. –

+0

이 문제의 내부 작업을 이해하고 싶습니다. –

+0

@Sourav Ghosh 내 이해를 위해. –

답변

2

아마도 정수는 시스템에 2's complement 표현을 사용하여 저장되었을 것입니다.

2의 보수에서 4 비트 비트 필드는 -8부터 +7까지의 범위를 유지할 수 있습니다. 1000 비트 표현은 -8을 의미하며 +8을 저장할 수 없습니다.

범위를 벗어난 값 (이 경우 +8)을 할당하면 구현 정의 동작이 발생합니다.

+0

아주 좋은 대답 – clearlight

+0

아주 잘 했어. – clearlight

+1

방금 ​​칭찬 2 개를주었습니다. – clearlight