2011-10-18 2 views
2
#include <stdio.h> 
#include <stdbool.h> 

int main() 
{ 
bool a[5]={0,1,0,0,0}; 
a[1]=3; 
printf("\n bool is %d",a[1]); 
printf("\n sizeof bool is %d and size of a is %d",sizeof(bool),sizeof(a)); 

bool b[10]; 
printf("\n bool is %d",b[1]); 

} 

출력된다미스터리

bool is 1 
sizeof bool is 1 and size of a is 5 
bool is 4 

질문 :

1> BOOL 가기 1 비트 후 (BOOL) 1 바이트를 sizeof를 왜?

2 내가 할당 할 때 BOOL 다음 1 바이트를 가지고> 경우 [1] = 3은 왜이 1 인쇄?

3> 만 [1]의 값 (3)을 출력하는 이유 b를 다음 저장소로 1 & O 값을 고려하는 경우 BOOL?

답변

14

1> BOOL 저장소는 1 비트는 아니다. 아무것도 1 비트가 아닙니다. 모든 것은 적어도 1 바이트입니다. sizeof(bool)은 플랫폼에 따라 다릅니다.

3 (bool)3 == 1이> 배열 b가 초기화되지 않습니다, 그것은 임의의 값을 가질 수 있습니다 만 sizeof(char) 그것은 암시 intbool에 변환> 1.

이 보장된다. 방금 메모리에 액세스하고 있습니다.

+0

, 바이트는 저장 메모리에 될 것'00000001' 또는 1'11111111'? – kAmol

+0

"모든 것이 적어도 1 바이트입니다."-> 구조의 필드는 어떻습니까? – chux

0

는 C에서 실제 부울 타입이 없다. C는 정수가 0이면을 의미하고 나머지는 참인 것으로 해석합니다. bool은 단일 비트 만 필요로 할지라도 대부분 아키텍처에서 가장 작은 주소 지정이 가능한 단위는 바이트이므로 실제로는 사용되지 않습니다. 바이트로 1 비트를 제외한 모두 마스킹 경로를 따라가는 대신 위에서 설명한 방법을 사용합니다.

C99의 stdbool.h은 typedef bool과 매크로 truefalse을 제공합니다. 매크로는 각각 0과 1로 확장되지만 소스를보다 이해하기 쉽게 만듭니다. sizeof은 구현에 따라 정의되며 다른 플랫폼에서도 동일하게 사용할 수는 없습니다. b 어레이가 초기화되지 않기 때문에

+2

C89보다는 C가 더 있습니다. –

+0

@Luc stdbool.h에 대한 단락을 추가했습니다 – pmr

+0

이것은 C++과 C로 태그가 붙어 있습니다. 아마도 stdbool.h의 bool은 C++의 실제 부울 유형 "bool"과 충돌합니다 ... – Benj

1

이유 최후의 printf 인쇄 4는 단지의 printf 함수를 의미 값이 이미 메모리에 어떤 취하는 것이다. 한 의심을 제외하고, 맑고 깨끗한