2017-01-08 4 views
-4
#include<stdio.h> 
int main(void) 
{ 
struct str 
{ 
    int i: 1; 
    int j: 2; 
    int k: 3; 
    int l: 4; 
}; 

struct str s; 

s.i = 1; 
s.j = 2; 
s.k = 5; 
s.l = 10; 

printf(" i: %d \n j: %d \n k: %d \n l: %d \n", s.i, s.j, s.k, s.l); 

getchar(); 
return 0; 
} 

출력 :누군가 나에게 설명 할 수있는 이유는 다음과 같은 결과가 나오는 이유는 무엇입니까? 웹 사이트에 주어

i: 1 
j: 2 
k: 5 
l: 10 

은 내가 비트 필드 무엇인지 이해하지 못하는

i :-1 
j : -2 
k : -3 
l : -6 

을 얻었다. 그리고 누군가이 코드에서 어떤 일이 벌어지고 있는지 말해 줄 수 있습니까?

+2

책 또는 Google을 읽거나이 사이트를 검색하여 비트 필드를 확인하십시오. 그리고 대부분의 비트 필드 동작이 표준화되지 않았기 때문에 결과가 예제와 다릅니다. 그렇기 때문에 코드가 다른 컴파일러에서 작동하도록하려면 비트 필드를 피하는 것이 좋습니다. –

+2

* "웹 사이트에서 출력"* - 어떤 웹 사이트입니까? – StoryTeller

+1

'int i : 1'은 0이됩니다. signed int 비트 필드는 부호 비트를 예약하고, 한 비트만 제공했기 때문에 음수 또는 양수가 될 수 있지만 상환 가능한 크기 값은없는 부호있는 비트 필드가 남았습니다 (값을 남기지 않는 비트). 이 코드의 나머지 부분은 제공된 비트 (부호 비트 이하)에서 가능한 최대 값을 위반하는 연습으로 보입니다. – WhozCraig

답변

2

부호가있는 변수의 각 너비에 대해 가능한 비트 패턴의 열을 써서 그 옆에있는 십진수와 동등한 값을 얻으면 곧 그 결과를 얻는 이유를 알게 될 것입니다. 2의 보수 표현을 가정하면 1 비트 부호있는 변수는 -1과 0의 두 가지 값을 갖습니다. 부호있는 2 비트 변수는 -2에서 1까지의 값을 저장합니다. s.i = 1;int 값 (1) 귀하의 경우에는

Bin Dec  Bin Dec  Bin Dec 
011 3  01 1  0 0 
010 2  00 0  1 -1 
001 1  11 -1 
000 0  10 -2 
111 -1 
110 -2 
101 -3 
100 -4 

이진 1, 당신은 1 비트 변수에 대해 볼 수 있듯이,이 값을 가지고 -1.

s.j = 2;의 경우 int 값 2는 2 진수 10이며, 2 비트 변수에서 볼 수 있듯이이 값은 -2입니다.

s.k = 5;의 경우 int 값 5는 2 진수 101이며 3 비트 변수에서 볼 수 있듯이이 값은 -3입니다.

그러나 이것은 부호가있는 정수의 표현 가능한 범위를 벗어난 값을 할당하는 구현 정의 동작이기 때문에 무엇이 발생하는지에 대한 설명 일뿐입니다.

네 자신을 위해 4 비트 코드를 만들어 보겠습니다. s.l = 10;을 사용하면 값이 4 비트 부호있는 변수의 범위 (-8-7)를 벗어납니다.