카테고리 보관물: C

컴파일러들의 특성 :: 형변환

어제 저녁부터 황당했던걸 쓰고자 한다.

일단은 바쁜 관계로 포스트를 꾸준히 올리지 못한거… 내 자신에게 미안해 죽겠다.
작업 기록을 남겨야 하는데….

일단 형변환…

타입 케스트라고도 한다.

컴파일러마다 고유의 특성이 있다.  그 중 형변환에 관련해서 약간씩 틀리다.

자동화가 잘 되어있는 Delphi 나 VC++ 의 경우 정수간의 타입 케스트는 컴파일러가 알아서 한다.

물론 100 % 는 아니다.  컴파일러라는 프로그램도 사람이 만들었으니까……

C나 C++ 의 경우 타 언어에 비해 프로그래머의 자유도가 높은 언어이다.

하지만 그 자유도가 버그를 만들어 내는 경우가 있고, 프로그래머의 의도와 다르게 움직여서 오류를 만들어내는 경우가 있는데, 어제 그걸 당했다는 것…

물론 내 실수다.  C 언어 코딩에서 중요한건 컴파일러에게 확실하게 지시해야 만일의 문제도 피해갈 수 있다는 것이고, 많은 C 언어 서적에서 중요시 하는 부분이다.

물론 코딩에서 명확하게 지시한다면 그 코드를 보는 자신이나 다른이들에게도 도움이 된다.

어제 낸 버그를 간략하게 예제로 나타내 보겠다.
참고로 컴파일러는 IAR 사의 C 컴파일러 이다.

unsigned short Value_A;
unsigned short Value_B;
unsigned long Result;
Value_A = 770;
Value_B = 960;
Result = Value_A * Value_B / 1000;

주_ unsigned short : 2 Byte 정수형. 0 ~ 65535 까지 표현가능.
주_ unsigned logn  : 4 Byte 정수형. 0 ~ 4294967295 까지 표현가능.

Result 값은 18 이 나왔다. 재차 확인하고 디어셈 코드 보다가 여기저기 콜 하고 점프 하길래 퇴근했다. (-_-)

그리고 오늘 아침 출근…. 좌석 버스에서 졸았다… 눈 떴더니 내릴 정류장이더라….
5 분만 늦게 일어났어도 안양 가있을 뻔 했다….
( 굴비 : 900 원의 차비를 더 들여서 빠르고 편하게 갈 수 있는 강화 – 구로 – 안양 노선 강화운수 3 번 좌석 버스를 알려준 혜진이누나에게 감사를 표시한다. )

일단 졸면서 문득 생각이 난거…. 형.변.환…

그렇다.

바보 컴파일러에게 내가 어떤 정수형을 사용할 것인지 안알려 준 것.
결국 엄하게 연산해서 범위를 넘기고 나누어주는 센스를 발휘하여 결과로 1818181818181818 한거다.

다음과 같이 수정해서 한방에 끝…

unsigned short Value_B;
unsigned long Result;
Value_A = 770;
Value_B = 960;
Result = (unsigned long)Value_A * (unsigned long)Value_B / 1000;

결과 값 = 739  …. OK!!!

조심하자.  그리고 바보 컴파일러에게는 하나하나 자세히 알려주자.  명심할 것!!!