아래의 소스를 실행했을 때의 결과는 다음과 같다.
소스
#include <stdio.h>
union TFontStyle
{
struct
{
int useItalic: 1;
int useBold: 1;
int isFixed: 1;
int reserved: 1;
int grayLevel: 4;
int color: 24;
};
int data;
};
int main()
{
// TFontStyle의 크기를 확인해 본다.
// union이니 보통 4bytes가 나올 것이다.
printf("sizeof(TFontStyle) = %d\n", sizeof(TFontStyle));
{
TFontStyle fontStyle;
// 전체 bit field를 초기화
fontStyle.data = 0;
// 위에서 초기화를 했으니 아마도 0이겠지.
printf("useItalic = %d\n", fontStyle.useItalic);
// 이태릭을 사용하는 것으로 설정.
fontStyle.useItalic = 1;
// 위로 설정한 대로 그대로 비교를 하자.
// 그 결과는?
if (fontStyle.useItalic == 1)
printf("That's the way!!\n");
else
printf("why??!!\n");
}
return 0;
}
결과
sizeof(TFontStyle) = 4
useItalic = 0
why|! <-- 왜 이것이 출력되지?
딴 부분은 다 문제가 없고 제일 마지막의 if문이 문제인데, 이런 문제(2의 보수를 이용한 음수 표현)때문에 if문의 분기가 예측과는 다르게 나간다면 참으로 잡기 어려운 버그를 만들 수 있을 것이다.
Posted by 안영기