%ld 와 %hd의 처리에대한 질문입니다.
제가 C언어를 공부하기 위해 책을 사서 실습을 하던중에
/* print2.c -- 또 다른 printf()함수의 특징 */
#include <stdio.h>
int main(void){
unsigned int un = 3000000000;
short sn = 200;
long ln = 65537;
printf("un = %u and not %d\n", un, un);
printf("sn = %hd and not %d\n", sn, sn);
printf("ln = %ld and not %hd\n", ln, ln);
return 0;
}
위와같은 예제를 실행했습니다.
그런데 책에서는 결과값이
un = 3000000000 and not -1294967296
sn = 200 and not 200
ln = 65537 and not 1
이렇게 나와야하는데 실행해보니
un = 3000000000 and not -1294967296
sn = 200 and not 200
ln = 65537 and not 65537
이렇게 나오더군요
제 질문은 gcc(제가 쓰고있는 버전은 3.4.1입니다. 한소프트리눅스2005에 포함되어있는)에서는 알아서 오류를 잡아서 실행시켜주는가 하는겁니다.
처음에 책하고 똑같은 값이 안나와서 좀 당황했는데 몇번이나 살펴봐도 코딩을 잘못한것은 아니기에 질문드리는 것입니다.
%ld로 해야할것은 %hd로 했으니 데이터손실(?)이 일어나야 할거 같은데 결과물은 정상값아하고 같이 나오니 말입니다.
그렇다면 저위의 %u와 %d의 차이도 알아서 수정이 되야하는데 말이죠
유독 %ld 와 %hd만 제대로 적용되는지 모르겠기에 질문드립니다....
혹시 64비트 머신이라서 그런게 아닐까요?integer의 크기는 정량
혹시 64비트 머신이라서 그런게 아닐까요?
integer의 크기는 정량화된게 아니라 환경마다 틀립니다. 아직은 대부분 32비트 머신이라 관계없지만..
INT_MAX, SHRT_MAX 값을 확인해보세요...
이런식으로...
Re: %ld 와 %hd의 처리에대한 질문입니다.
책에서 printf 의 어떤 또다른 특징을 보여주기 위한 예제인지는 모르겠지만,
printf 를 어떻게 구현했는지에 따라, 결과는 다를 수 있습니다.
C 의 argument promotion 규칙에 따라, printf 는 %hd 에 해당하는
값을 얻기 위해 다음과 상응하는 코드를 쓸겁니다.
value 를 short 로 캐스트해서 출력하도록 구현 했다면 1이 나올 것이고,
그렇지 않았다면 65537이 나오는 것이죠. 즉, 구현하기 나름이고, 실행하는
환경 ( 기본 정수 크기, 바이트 오더 등 )에 따라 결과가 달라질 수 있습니다.
gcc 컴파일시 -Wall 옵션을 주고 빌드해보세요. 경고 하나가 나올겁니다.
무엇을 보여주려는 예제인지 모르겠지만, 좋은 예제는 아닌 것 같습니다.
Orion Project : http://orionids.org
답변 주셔서 정말 감사합니다.
저 예제는 형식 변환자를 설명하면서 형에 맞지않는 변환자를 쓰게되면
결과값이 잘 못나온다는 것을 보여주는 예제인데 책하고 다르게 나와서
좀 당황했거든요...
C언어 공부는 시작한지는 오래됐지만 하다안하다 를 반복하다보니 앞부분을 다 까먹어서 맘잡고 처음부터 다시 시작하는지라..ㅠ.ㅠ
어서 저도 능숙하게 플밍을 했으면 좋겠네요
==================================================================
정체된 일상.... 계기를 만들어야 하는데........
BLOG : http://khmirage.tistory.com/
[quote]형식 변환자를 설명하면서 형에 맞지않는 변환자를 쓰게되면 결
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기