2의 보수 방식의 맹점

아래의 소스를 실행했을 때의 결과는 다음과 같다.

소스
#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 슴갈

2009/02/15 09:52 2009/02/15 09:52
Response
No Trackback , 5 Comments
RSS :
http://avej.com/textcube/rss/response/6

Trackback URL : http://avej.com/textcube/trackback/6

Comments List

  1. Mahavishnu 2009/03/06 18:29 # M/D Reply Permalink

    확실히 비트단위의 처리에서는 char, int대신 U8, U32 따위를 써야하는것 같습니다.

    1. 슴갈 2009/03/15 10:32 # M/D Permalink

      예, 맞습니다. 정말 음수가 필요한 경우가 있다면 그때는 2의 보수의 특징을 제대로 이해한 뒤 써야겠지요.

  2. 병든개 2009/09/08 19:11 # M/D Reply Permalink

    2의 보수 표현방식을 떠나서 1의 보수 표현방식으로 사용되는 임플리멘테이션의 경우라 하더라도 1개의 비트로 비트필드구조체를 만드는 형식은 단순히 부호비트만을 가지는 연산으로 2의 보수일경우 -1, 0 으로 나눠지고 1의 보수일경우 +0 , -0 으로 나눠지게 되는데 (실제로 1의 보수를 사용하는 임플리멘테이션을 사용해본적은 없습니다.) 그럼 공통적으로 갖는 수가 0 이라 이식성이 떨어지는 경우가 되기때문에, 비트필드를 1개만갖고 만드는것은 코딩 자체에 문제가 있는거 아닌가요? 제가 뭐라 그러려는것이 아니라, 혹시나 제 생각이 틀렸을지도 모르니깐 혹시 아니라면 자세한 설명좀. chocoes@nate.com 으로 메일을 보내주셔도 되고 , 아니면 밑에 댓글 달아주셔도 되구요

    1. 슴갈 2009/09/09 21:47 # M/D Permalink

      1의 보수는 실제로 컴퓨터에 사용되지 않으니(적어도 지금 우리가 접할 수 있는...) 굳이 경우를 따질 필요는 없다고 생각됩니다.

      그리고 위의경우는 unsigned 를 붙이면 1의보수이든 2의 보수이든 문제가 해결되고, 말씀하신 +0 -0의 문제도 해결되기 때문에 비트 필트 1개로도 충분이 가능하다고 생각합니다. 실제로도 그렇게 쓰고 있고요.

  3. 병든개 2009/09/16 12:27 # M/D Reply Permalink

    그렇군요. 사실 1의보수방식을 사용하는 컴퓨터에 대해서 찾아보려다가 들어오게 됬는데. 결국 못찾게 됬지만 어찌됬든 좋은생각 고맙습니다^^

Leave a comment
[로그인][오픈아이디란?]
« Previous : 1 : ... 28 : 29 : 30 : 31 : 32 : 33 : 34 : 35 : 36 : ... 37 : Next »

블로그 이미지

GP2X WIZ와 CAANNO와 bada용 게임 개발을 하자

- 슴갈

Notices

Archives

Authors

  1. 슴갈

Recent Trackbacks

Calendar

«   2012/05   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Site Stats

Total hits:
41803
Today:
29
Yesterday:
55