C에서 double에 64비트 값을 넣는법에 대한 질문~

NeoCode24의 이미지

안녕하세요.. 여기저기에서 고수가 많다는 소문을 듣고 찾아와서

첫 질문을 올립니다.

문제는 다름이 아니라 double 자료형에 대해서 인데요..

업무도중 64비트 값을 넣기 위해 8바이트 자료형인 double에

가능하지 않을까 하는 생각을 하고 시도를 해보았습니다.

업무환경은 AIX 환경에 32비트 컴파일을 하고 있습니다.

64비트 자료형으로 제가 찾아본것은 __int64(VC++), int64,
sqlint64(int64를 결국 Define 한것), long long

모두다 sizeof() 를 하였더니 8바이트로 나오더군요..

근데 문제는 32비트의 한계인 2147483648 값에 1을 더한 값을 넣었더니..

역시나 다들 오버 플로우가 발생했습니다.

그건 결국 일반 4byte int와 다를 것이 없더군요.

그래서 이번에는 double에 넣어봤습니다.

double 에 넣었더니.. unsigned int 값 까지만 들어 가는 겁니다

딱 2배까지만요.. 게다가 출력시에는 기본 소수자리까지 나오죠..

제가 생각하기에는 기본 소수자리를 넣지 않고 그 부분을 정수로 해서 하면 될것 같은데요 ㅎㅎ

결론을 이야기 하자면...

64비트 값을 넣을수 있는 즉 2147483648 보다 큰값을 넣을 수 잇는 방법 또는, (2의 63인 9,223,372,036,854,775,808 값이겠죠?)

double 에서 8바이트를 실수를 포함하지 않는 정수만 넣을 수 잇는 방법이 있는지

아시는 분 있으면 답변 부탁드립니다 ^^

seoleda의 이미지

어떻게 확인 하셨죠?

int main(void){
    long long big_number;
    big_number=2147483648+10;
    printf(" %lld\n", big_number);
    return 0;
}

이렇게 확인해 보세요..

참고로 Visual C에서는

    printf(" %I64d\n", big_number);

입니다.
ssehoony의 이미지

seoleda wrote:
int main(void){
    long long big_number;
    printf(" %lld\n", big_number);
    return 0;
}

이 코드도 오류가 있는데요.

big_number=2147483648+10;

여기서 2147483648 는 int 입니다. 10 역시 int 입니다.
그럼 계산 결과 역시 int 이고 결과값 int 를 long long int 에 대입할 뿐이지요. 결국 원하는 값이 안나옵니다.

이건
big_number=2147483648LL+10LL;
이렇게 하거나
big_number=2147483648LL+10;
혹은
big_number=2147483648+10LL;
이렇게 하셔야 겠네요.

NeoCode24의 이미지

int main (int argc, char *argv[])
{
long long i = 9147483648ll;

printf ("long long i = %lld\n", i);

return 0;
}

해답 주신분들 감사해요..

넣는 Right value 의 값도 결국은 4바이트라는 한계가 있군요..

그걸 생각 못했는데.. 오른쪽 값 역시 ll 로 하면 되는군요 ㅎㅎ

감사합니다 ^^

doldori의 이미지

ssehoony wrote:
여기서 2147483648 는 int 입니다. 10 역시 int 입니다.
그럼 계산 결과 역시 int 이고 결과값 int 를 long long int 에 대입할 뿐이지요. 결국 원하는 값이 안나옵니다.

그렇지 않습니다. 정수형 상수(integer literal)의 형은 그보다 좀 복잡합니다.
2147483648가 INT_MAX와 LONG_MAX보다 큰 환경에서는 long long int의
형을 갖습니다. 그러니까 int, long int, long lont int 순으로 표현 가능한 형으로
결정되는 것이죠. 따라서 2147483648+10의 연산에서 수행되는 내용은
1. long long int + int
2. 두번째 피연산자의 형이 long long int로 승격(promotion)
3. 연산 결과의 형은 long long int
4. 이 결과를 long long int형의 변수에 대입
따라서 적법한 코드이고 의도대로 수행됩니다.
물론 LL suffix를 붙이는 편이 명확하다는 장점은 있습니다.
ssehoony의 이미지

doldori wrote:

2147483648가 INT_MAX와 LONG_MAX보다 큰 환경에서는 long long int의 형을 갖습니다.
그러니까 int, long int, long lont int 순으로 표현 가능한 형으로결정되는 것이죠.

gcc 에서는 위와 같은 결과를 보이고, msc(vs .net 2003) 에서는 문제가 있네요.
위의 이야기는 gcc 의 이야기 인가요? 아니면 C의 표준안 인가요?
만약 표준이라면 msc 는 표준을 소화해 내지 못 하고 있는 듯 하군요.

doldori의 이미지

ssehoony wrote:
doldori wrote:

2147483648가 INT_MAX와 LONG_MAX보다 큰 환경에서는 long long int의 형을 갖습니다.
그러니까 int, long int, long lont int 순으로 표현 가능한 형으로결정되는 것이죠.

gcc 에서는 위와 같은 결과를 보이고, msc(vs .net 2003) 에서는 문제가 있네요.
위의 이야기는 gcc 의 이야기 인가요? 아니면 C의 표준안 인가요?


C99입니다.

ssehoony wrote:
만약 표준이라면 msc 는 표준을 소화해 내지 못 하고 있는 듯 하군요.

네, .NET 7.1까지는 C99를 지원하지 않습니다. (8.0 beta는 어떤지 모릅니다.)
gcc는 일부 지원하고요.

아, 지금 확인해 보니 .NET에서는 위에서 seoleda님이 말씀하신 대로 I64라는
서식을 확장 기능으로 제공하는군요. 출력은 제대로 하네요.

댓글 달기

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