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

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

일단 형변환...

타입 케스트라고도 한다.

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

자동화가 잘 되어있는 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!!!

조심하자.  그리고 바보 컴파일러에게는 하나하나 자세히 알려주자.  명심할 것!!!
이올린에 북마크하기(0) 이올린에 추천하기(0)
2006/09/22 12:52 2006/09/22 12:52
Posted by TylorSTYLE™

BLOG main image

카테고리

전체 (119)
Freeware (2)
SAMSUNG MCU (14)
Embedded Linux (10)
AE32000(EAGLE) (2)
Mac OS X (5)
신변잡기 (48)
디지털 회로 (1)
Programming (12)
무선 네트워크 (15)
Computer (5)
사용기 (5)

글 보관함

124

87

-35 days

today : 21

Daum 블로거뉴스
믹시