소수점이 있는 double형의 10진수 실수를 16진수로 변환하는법?

kuroli의 이미지

변환기를 사용해보면 120.11은 16진수로 78.1c28f5c28f5c 입니다.

그런데 제가 아는 한, printf의 출력 형식은 %d나 %u (10진수 정수), %o나 %x (16진수 정수),

%f나 %lf, %g (10진수 실수) 인 걸로 아는데....

16진수 실수 표현인 78.1c28f5c28f5c 로 출력하는 법은 없나요?

%x로 출력해보니 3d70a3d7 같은 이상한 값이 나옵니다....

익명 사용자의 이미지

왜 %x로 출력했을 때 저 값이 나오는지를 이해하려면, 컴퓨터가 double형을 어떻게 저장하는지부터 익히셔야 합니다. https://en.wikipedia.org/wiki/Double-precision_floating-point_format

kuroli의 이미지

답변 감사합니다.
사실은, 저 문제를 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 타입의 인수를 제공했다는 정보 역시 담고 있는 거지요.
실제로 넘긴 인수와 일치하지 않는 타입 정보를 넘겨주면 대개의 경우 탈이 납니다.

각 서식 지정자에 대응되는 인수 타입은 레퍼런스를 참조하세요. 물론 자주 쓰는 건 곧 외우시게 될 겁니다:
http://en.cppreference.com/w/c/io/fprintf

레퍼런스가 원래의 질문에도 답을 주는군요. double 타입을 16진수 표기로 출력하고 싶으시면 %a를 쓰세요.
다만 C99부터 지원하는군요. 만약 C99 이전의 환경이라면 음... 제가 알기로는 표준 라이브러리에서 제공하는 건 없고 직접 작성해야 할 겁니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.