|
일단은 바쁜 관계로 포스트를 꾸준히 올리지 못한거... 내 자신에게 미안해 죽겠다. 작업 기록을 남겨야 하는데.... 일단 형변환... 타입 케스트라고도 한다. 컴파일러마다 고유의 특성이 있다. 그 중 형변환에 관련해서 약간씩 틀리다. 자동화가 잘 되어있는 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!!! 조심하자. 그리고 바보 컴파일러에게는 하나하나 자세히 알려주자. 명심할 것!!! |
|



