답변 감사합니다.
사실은, 저 문제를 SPARC 프로세서 (어셈블리 언어 레벨) 에서 구현하기 위해 질문을 올렸습니다.
double (배정밀도) 형이니 레지스터 2개에 나뉘어져 2진수 코드로 저장되어 있겠죠.
예를 들어, 10진수 1.5라면 형식에 따라 0x3ff800000.... 의 HEX 형태로 바꾸는 방법은 알고 있습니다.
손으로 종이에 풀면 말이죠....
그런데 직접 컴퓨터로 %f 포맷으로 출력하면 제대로 결과가 나오는데 %x포맷으로는 결과가 제대로 나오지 않네요.
알려주신 사이트에는 double형의 저장방식만 나와 있고 %x포맷에서 결과가 나오지 않는 이유는 추론할 수 없는 것 같습니다..
%x으로 결과가 나오지 않는 이유는 간단합니다.
double을 넘겨주고는 unsigned int로 해석해서 출력하라고 지시하셨으니까 그렇지요.
그 경우 출력되는 값은 일반적으로 double과 unsigned int의 비트 표현에 의존하게 됩니다만, 어떻게 되는지 이미 아시는 것 같군요.
C언어의 가변 인수 함수는 굉장히 원시적으로 지원됩니다. 사실상 그냥 무작정 메모리 뭉치를 던져주는 것이나 다름없습니다.
받는 쪽에서는 어떤 타입의 인수가 몇 개 들어왔는지 알 방법이 없습니다. 따로 알려 줘야 합니다.
*printf류 함수들에서 서식 지정자(format specifier)는 따라서 출력 서식 뿐만 아니라 어떤 타입의 인수가 들어왔는지도 가리키게 되어 있습니다.
예컨대 %x는 출력을 16진수 표기로 하라는 지시 뿐만 아니라, unsigned int 타입의 인수를 제공했다는 정보 역시 담고 있는 거지요.
실제로 넘긴 인수와 일치하지 않는 타입 정보를 넘겨주면 대개의 경우 탈이 납니다.
왜 %x로 출력했을 때 저 값이 나오는지를 이해하려면
왜 %x로 출력했을 때 저 값이 나오는지를 이해하려면, 컴퓨터가 double형을 어떻게 저장하는지부터 익히셔야 합니다. https://en.wikipedia.org/wiki/Double-precision_floating-point_format
현재 어셈블리 언어 공부중입니다.
답변 감사합니다.
사실은, 저 문제를 SPARC 프로세서 (어셈블리 언어 레벨) 에서 구현하기 위해 질문을 올렸습니다.
double (배정밀도) 형이니 레지스터 2개에 나뉘어져 2진수 코드로 저장되어 있겠죠.
예를 들어, 10진수 1.5라면 형식에 따라 0x3ff800000.... 의 HEX 형태로 바꾸는 방법은 알고 있습니다.
손으로 종이에 풀면 말이죠....
그런데 직접 컴퓨터로 %f 포맷으로 출력하면 제대로 결과가 나오는데 %x포맷으로는 결과가 제대로 나오지 않네요.
알려주신 사이트에는 double형의 저장방식만 나와 있고 %x포맷에서 결과가 나오지 않는 이유는 추론할 수 없는 것 같습니다..
%x으로 결과가 나오지 않는 이유는 간단합니다.
%x으로 결과가 나오지 않는 이유는 간단합니다.
double을 넘겨주고는 unsigned int로 해석해서 출력하라고 지시하셨으니까 그렇지요.
그 경우 출력되는 값은 일반적으로 double과 unsigned int의 비트 표현에 의존하게 됩니다만, 어떻게 되는지 이미 아시는 것 같군요.
C언어의 가변 인수 함수는 굉장히 원시적으로 지원됩니다. 사실상 그냥 무작정 메모리 뭉치를 던져주는 것이나 다름없습니다.
받는 쪽에서는 어떤 타입의 인수가 몇 개 들어왔는지 알 방법이 없습니다. 따로 알려 줘야 합니다.
*printf류 함수들에서 서식 지정자(format specifier)는 따라서 출력 서식 뿐만 아니라 어떤 타입의 인수가 들어왔는지도 가리키게 되어 있습니다.
예컨대 %x는 출력을 16진수 표기로 하라는 지시 뿐만 아니라, unsigned int 타입의 인수를 제공했다는 정보 역시 담고 있는 거지요.
실제로 넘긴 인수와 일치하지 않는 타입 정보를 넘겨주면 대개의 경우 탈이 납니다.
각 서식 지정자에 대응되는 인수 타입은 레퍼런스를 참조하세요. 물론 자주 쓰는 건 곧 외우시게 될 겁니다:
http://en.cppreference.com/w/c/io/fprintf
레퍼런스가 원래의 질문에도 답을 주는군요. double 타입을 16진수 표기로 출력하고 싶으시면 %a를 쓰세요.
다만 C99부터 지원하는군요. 만약 C99 이전의 환경이라면 음... 제가 알기로는 표준 라이브러리에서 제공하는 건 없고 직접 작성해야 할 겁니다.
댓글 달기