C언어 실수 상수와 정수 상수의 자료형 질문이에요.

bureokjam의 이미지

상수의 뒤에 접미사가 붙지 않는다는 가정하에 실수 상수는 무조건 double형입니다. 하지만 정수 상수는 잘 정의된 규칙에 의해 자료형이 결정됩니다. 궁금한 것은 잘 정의된 규칙이 실수 상수에는 왜 없는지입니다. 혹시 실수 자료형의 개수는 얼마되지 않으므로 규칙을 정의한다는 것이 민망(?)하기 때문인가요?

raymundo의 이미지

"잘 정의된 규칙"은 무얼 말씀하시는 것이고 그 규칙에 의해 자료형이 결정된다는 건 또 어떤 건지 예를 들어주시면 좋을 것 같습니다.

좋은 하루 되세요!

 의 이미지

"잘 정의됨"이라는 표현은 보통 https://en.wikipedia.org/wiki/Well-defined 이런 의미로 쓰이지요.

그런 의미에서 볼 때 접미사 없는 부동소수점 상수 타입은 접미사 없는 정수 상수 타입만큼이나 잘 정의되었다고 볼 수 있습니다. 그냥 더 간단한 규칙일 뿐이죠.

전웅의 이미지

재미있는 질문이네요.

정수형은 상수의 크기에 따라 데이터형을 선택하는 규칙이 있는데 왜
부동소수점 상수는 suffix 로만 데이터형이 결정되냐는 질문인거죠?

둘의 차이는 C 언어의 역사에서 기원합니다.

표준화 이전의 C 언어에는 float 형은 있었지만 모든 부동소수점 연산은
double 형으로 계산되었습니다. (long double 은 표준에서 추가된 데이터형
이므로 고민할 필요가 없습니다.) 즉, 연산의 모든 피연산자가 float 형
이어도 double 형으로 연산이 진행된 것이지요.

그러니 당시 C 언어의 정의에서 모든 부동소수점 상수는 무조건 double 형
이었고, suffix 자체가 존재하지 않았습니다.

이후 float 을 double 보다 효율적으로 처리할 수 있는 환경이 많음에도
표준화 단계에서 double 형으로만 계산된다는 규칙을 표준으로 정하면
비효율적으로 연산을 하게 되는 상황이 발생했을 것입니다. 이 때문에
부동소수점 연산은 double 로만 수행된다는 규칙을 버리고 float 형으로만
피연산자가 이루어진 경우 float 형으로 연산이 이루어질 수 있다고
(그래야만 한다는 요구가 아닙니다!) 규칙을 변경하였습니다.

그러니 이제 부동소수점 상수를 float 형으로 만들 수 있는 방법이 필요해
졌습니다. 그래서 suffix 를 추가해 f 로 끝나는 부동소수점 상수는
float 형이라고 규칙을 정한 것입니다. 더불어 새로 추가된 long double 형
상수를 만드는 suffix 도 추가한 것이지요.

이런 탓에 부동소수점 상수는 suffix 가 없으면 double, suffix 에 따라
float 이나 long double 형을 가지게 되었습니다.

정수 상수의 경우 (표준화된 내용과는 살짝 다르지만) 당시부터 크기나
형식에 따라 데이터형이 결정되는 규칙이 있었기에 이를 표준화한 결과가
지금 우리가 만나는 규칙입니다.

상상하신대로 부동소수점 상수의 데이터형 역시 정수형처럼 결정되도록
정할 수 있었을지도 모릅니다. 다만, 그런 선례(existing practice)가
없는 상황에서 굳이 복잡한 규칙을 도입할 이유가 없었을 것입니다.

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

bureokjam의 이미지

언급해주신 역사 덕분에 궁금했던 부분이 깔끔하게 이해됬어요!
적지않은 시간이 흘렀기에 감사의 인사를 생략할까도 생각했지만 설레일 정도로 재밌는 내용이라 그냥 지나칠수가 없었습니다. 늦었지만 도움주신점 감사합니다!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.