우선 다음 소스는 컴파일하는데는 아무 문제가 없지만 실행 결과는 전혀 엉뚱하다.
printf 함수에 사용된 %lld 포맷에 문제가 있기 때문이다.
/*
* Filename: testLongLong0.c
*
* Compile: gcc -o testLongLong0 testLongLong0.c
* or
* Compile: cl testLongLong0.c
*/
#include <stdio.h>
int main()
{
printf("Maximum long long value is %40lld\n", 9223372036854775807LL);
printf("Maximum long long value is %40llu\n", 9223372036854775807ULL);
printf("Maximum long long value is %40lld\n", 9223372036854775808LL);
printf("Maximum long long value is %40llu\n", 9223372036854775808ULL);
return 0;
}
우선 다음은 32비트 윈도우 XP의 명령창에서 Visual C++ 2010 의 명령줄 컴파일러 cl 로 컴파일하여 실행한 경우이다.
컴파일> cl testLongLong0.c
Microsoft (R) 32비트 C/C++ 최적화 컴파일러 버전 16.00.40219.01(80x86)
Copyright (c) Microsoft Corporation. 모든 권리 보유.
testLongLong0.c
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:testLongLong0.exe
testLongLong0.obj
실행> testLongLong0
Maximum long long value is 9223372036854775807
Maximum long long value is 9223372036854775807
Maximum long long value is -9223372036854775808
Maximum long long value is 9223372036854775808
그리고 다읍은 32비트 윈도우 XP의 명령창에서 MinGW 의 gcc(버잔 4.7.3) 로 컴파일하여 실행한 경우이다.
컴파일> gcc -o testLongLong0 testLongLong0.c
testLongLong0.c: In function 'main':
testLongLong0.c:15:51: warning: integer constant is so large that it is unsigned
[enabled by default]
testLongLong0.c:15:5: warning: this decimal constant is unsigned only in ISO C90
[enabled by default]
실행> testLongLong0
Maximum long long value is -1
Maximum long long value is 4294967295
Maximum long long value is 0
Maximum long long value is 0
* ISO C99 표준에 따라 64비트 정수를 printf 함수로 출력할 때 inttypes.h 헤터파일을 인클루드하고 PRId64, PRIu64, PRIx64, PRIX64 등을 사용한다. 예를 들면,
printf("My value is %10"PRId64"\n", some_64_bit_expression);
이다. scanf 함수로 64비트 정수를 입력받을 때는 SCNd64, SCNu64, SCNx64, SCNX64 등을 사용한다.
아래의 소스는 gcc 로 컴파일할 때 경고는 있지만 실행시 출력은 정상이다.
* Filename: testLongLong1.c
*
* Compile: gcc -o testLongLong1 testLongLong1.c
*
* See: http://en.wikipedia.org/wiki/Printf_format_string
* See: http://msinttypes.googlecode.com/svn/trunk/inttypes.h
* See: http://en.wikibooks.org/wiki/C_Programming/C_Reference/inttypes.h
*/
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main()
{
printf("Maximum int64 value is %40" PRId64 "\n", 9223372036854775807L);
printf("Maximum int64 value is %40" PRIx64 "\n", 9223372036854775807L);
printf("Maximum int64 value is %40" PRIX64 "\n", 9223372036854775807L);
printf(" uint64 value is %40" PRIu64 "\n", 9223372036854775807L);
printf("Maximum int64 value is %40" PRId64 "\n", 9223372036854775808L);
printf("Maximum int64 value is %40" PRIx64 "\n", 9223372036854775808L);
printf("Maximum int64 value is %40" PRIX64 "\n", 9223372036854775808L);
printf("Maximum uint64 value is %40" PRIu64 "\n", 9223372036854775808L);
printf("Maximum uint64 value is %40" PRIx64 "\n", 18446744073709551615ULL);
printf("Maximum uint64 value is %40" PRIX64 "\n", 18446744073709551615ULL);
printf("Maximum uint64 value is %40" PRIu64 "\n", 18446744073709551615ULL);
printf("Maximum int64 value is |%-40" PRId64 "|\n", INT64_MAX);
printf("Maximum int64 value is |%-40" PRIu64 "|\n", INT64_MAX);
printf("Maximum int64 value is |%-40" PRIx64 "|\n", INT64_MAX);
printf("Maximum int64 value is |%-40" PRIX64 "|\n", INT64_MAX);
printf("Maximum uint64 value is |%-40" PRIu64 "|\n", UINT64_MAX);
printf("Maximum uint64 value is |%-40" PRIu64 "|\n", UINT64_MAX);
printf("Maximum uint64 value is |%-40" PRIx64 "|\n", UINT64_MAX);
printf("Maximum uint64 value is |%-40" PRIX64 "|\n", UINT64_MAX);
return 0;
}
/*
-----------------
Execute Result:
-----------------
Maximum int64 value is 9223372036854775807
Maximum int64 value is 7fffffffffffffff
Maximum int64 value is 7FFFFFFFFFFFFFFF
uint64 value is 9223372036854775807
Maximum int64 value is -9223372036854775808
Maximum int64 value is 8000000000000000
Maximum int64 value is 8000000000000000
Maximum uint64 value is 9223372036854775808
Maximum uint64 value is ffffffffffffffff
Maximum uint64 value is FFFFFFFFFFFFFFFF
Maximum uint64 value is 18446744073709551615
Maximum int64 value is |9223372036854775807 |
Maximum int64 value is |9223372036854775807 |
Maximum int64 value is |7fffffffffffffff |
Maximum int64 value is |7FFFFFFFFFFFFFFF |
Maximum uint64 value is |18446744073709551615 |
Maximum uint64 value is |18446744073709551615 |
Maximum uint64 value is |ffffffffffffffff |
Maximum uint64 value is |FFFFFFFFFFFFFFFF |
*/
* Visual C++ 2010 에서는 64비트 정수를 printf 함수로 출력하기 위해 PRId64, PRIu64, PRIx64, PRIX64 등을 사용하면 inttypes.h 헤더 파일을 찾을 수 없다는 에러가 난다. 이 에러를 해결하기 위해 http://msinttypes.googlecode.com/svn/trunk/inttypes.h 를 인클루드하였다.
아래의 소스는 cl 로 경고 없이 컴파일도 잘 되고 실행시 출력도 정상이다.
* Filename: testLongLong.c
*
* Compile: cl testLongLong.c
*
* See: http://en.wikipedia.org/wiki/Printf_format_string
* See: http://msinttypes.googlecode.com/svn/trunk/inttypes.h
* See: http://en.wikibooks.org/wiki/C_Programming/C_Reference/inttypes.h
*/
#include <stdio.h>
#include <stdio.h>
#include "inttypes.h"
int main()
{
printf("Maximum int64 value is %40" PRId64 "\n", 9223372036854775807L);
printf("Maximum int64 value is %40" PRIx64 "\n", 9223372036854775807L);
printf("Maximum int64 value is %40" PRIX64 "\n", 9223372036854775807L);
printf(" uint64 value is %40" PRIu64 "\n", 9223372036854775807L);
printf("Maximum int64 value is %40" PRId64 "\n", 9223372036854775808L);
printf("Maximum int64 value is %40" PRIx64 "\n", 9223372036854775808L);
printf("Maximum int64 value is %40" PRIX64 "\n", 9223372036854775808L);
printf("Maximum uint64 value is %40" PRIu64 "\n", 9223372036854775808L);
printf("Maximum uint64 value is %40" PRIx64 "\n", 18446744073709551615ULL);
printf("Maximum uint64 value is %40" PRIX64 "\n", 18446744073709551615ULL);
printf("Maximum uint64 value is %40" PRIu64 "\n", 18446744073709551615ULL);
printf("Maximum int64 value is |%-40" PRId64 "|\n", INT64_MAX);
printf("Maximum int64 value is |%-40" PRIu64 "|\n", INT64_MAX);
printf("Maximum int64 value is |%-40" PRIx64 "|\n", INT64_MAX);
printf("Maximum int64 value is |%-40" PRIX64 "|\n", INT64_MAX);
printf("Maximum uint64 value is |%-40" PRIu64 "|\n", UINT64_MAX);
printf("Maximum uint64 value is |%-40" PRIu64 "|\n", UINT64_MAX);
printf("Maximum uint64 value is |%-40" PRIx64 "|\n", UINT64_MAX);
printf("Maximum uint64 value is |%-40" PRIX64 "|\n", UINT64_MAX);
return 0;
}
/*
-----------------
Execute Result:
-----------------
Maximum int64 value is 9223372036854775807
Maximum int64 value is 7fffffffffffffff
Maximum int64 value is 7FFFFFFFFFFFFFFF
uint64 value is 9223372036854775807
Maximum int64 value is -9223372036854775808
Maximum int64 value is 8000000000000000
Maximum int64 value is 8000000000000000
Maximum uint64 value is 9223372036854775808
Maximum uint64 value is ffffffffffffffff
Maximum uint64 value is FFFFFFFFFFFFFFFF
Maximum uint64 value is 18446744073709551615
Maximum int64 value is |9223372036854775807 |
Maximum int64 value is |9223372036854775807 |
Maximum int64 value is |7fffffffffffffff |
Maximum int64 value is |7FFFFFFFFFFFFFFF |
Maximum uint64 value is |18446744073709551615 |
Maximum uint64 value is |18446744073709551615 |
Maximum uint64 value is |ffffffffffffffff |
Maximum uint64 value is |FFFFFFFFFFFFFFFF |
*/
* 다음 소스는 gcc 또는 cl 어느 것으로도 컴파일되고 실행결과도 같지만, gcc 로 컴파일 할 때는 인크루드 부분을
#include <inttypes.h>
로 수정해야 한다. gcc 는 4.7.x 이상이면 컴파일되고, Visual C++ 는 2008 이상이면 컴파일된다.
그대신 Visual C++ 2008 에는 헤더파일 stdint.h 가 빠져 있으므로 http://msinttypes.googlecode.com/svn/trunk/stdint.h 에서 내려받으면 된다. Visual C++ 2010 에는 이 헤더파일이 이미 있으므로 상관 없다.
* gcc 로 컴파일하기:
gcc -std=c99 -o testLongLong2 testLong2.c
또는
gcc -o testLongLong2 testLong2.c
* cl 로 컴파일하기:
cl testLong2.c
/*
* Filename: testLongLong2.c
*
* Compile: gcc -o testLongLong2 testLongLong2.c
* or
* Compile:cl testLongLong2.c
*
* See: http://en.wikipedia.org/wiki/Printf_format_string
* See: http://msinttypes.googlecode.com/svn/trunk/inttypes.h
* See: http://msinttypes.googlecode.com/svn/trunk/stdint.h
* See: http://en.wikibooks.org/wiki/C_Programming/C_Reference/inttypes.h
*/
#include <stdio.h>
#include "stdint.h" // #include <inttypes.h> for gcc or Visual C++ 2010
#include "inttypes.h" // #include <inttypes.h> for gcc
int main()
{
printf(" INT64_MAX = %30" PRId64 "\n", INT64_MAX);
printf(" INT64_MAX = %30" PRIx64 "\n", INT64_MAX);
printf("UINT64_MAX = %30" PRIu64 "\n", UINT64_MAX);
printf("UINT64_MAX = %30" PRIx64 "\n", UINT64_MAX);
printf("\n");
printf("Maximum int64 value is %40" PRId64 "\n", 9223372036854775807LL);
printf("Maximum int64 value is %40" PRIx64 "\n", 9223372036854775807LL);
printf("Maximum int64 value is %40" PRIX64 "\n", 9223372036854775807LL);
printf(" uint64 value is %40" PRIu64 "\n", 9223372036854775807LL);
printf("Maximum int64 value is %40" PRId64 "\n", 9223372036854775808ULL);
printf("Maximum int64 value is %40" PRIx64 "\n", 9223372036854775808ULL);
printf("Maximum int64 value is %40" PRIX64 "\n", 9223372036854775808ULL);
printf("Maximum uint64 value is %40" PRIu64 "\n", 9223372036854775808ULL);
printf("Maximum uint64 value is %40" PRIx64 "\n", 18446744073709551615ULL);
printf("Maximum uint64 value is %40" PRIX64 "\n", 18446744073709551615ULL);
printf("Maximum uint64 value is %40" PRIu64 "\n", 18446744073709551615ULL);
printf("Maximum int64 value is |%-40" PRId64 "|\n", INT64_MAX);
printf("Maximum int64 value is |%-40" PRIu64 "|\n", INT64_MAX);
printf("Maximum int64 value is |%-40" PRIx64 "|\n", INT64_MAX);
printf("Maximum int64 value is |%-40" PRIX64 "|\n", INT64_MAX);
printf("Maximum uint64 value is |%-40" PRIu64 "|\n", UINT64_MAX);
printf("Maximum uint64 value is |%-40" PRIu64 "|\n", UINT64_MAX);
printf("Maximum uint64 value is |%-40" PRIx64 "|\n", UINT64_MAX);
printf("Maximum uint64 value is |%-40" PRIX64 "|\n", UINT64_MAX);
return 0;
}
/*
-----------------
Execute Result:
-----------------
INT64_MAX = 9223372036854775807
INT64_MAX = 7fffffffffffffff
UINT64_MAX = 18446744073709551615
UINT64_MAX = ffffffffffffffff
Maximum int64 value is 9223372036854775807
Maximum int64 value is 7fffffffffffffff
Maximum int64 value is 7FFFFFFFFFFFFFFF
uint64 value is 9223372036854775807
Maximum int64 value is -9223372036854775808
Maximum int64 value is 8000000000000000
Maximum int64 value is 8000000000000000
Maximum uint64 value is 9223372036854775808
Maximum uint64 value is ffffffffffffffff
Maximum uint64 value is FFFFFFFFFFFFFFFF
Maximum uint64 value is 18446744073709551615
Maximum int64 value is |9223372036854775807 |
Maximum int64 value is |9223372036854775807 |
Maximum int64 value is |7fffffffffffffff |
Maximum int64 value is |7FFFFFFFFFFFFFFF |
Maximum uint64 value is |18446744073709551615 |
Maximum uint64 value is |18446744073709551615 |
Maximum uint64 value is |ffffffffffffffff |
Maximum uint64 value is |FFFFFFFFFFFFFFFF |
*/
'프로그래밍 > C' 카테고리의 다른 글
64bit 리눅스에서 32bit 용 C 소스 컴파일하기 (0) | 2014.01.04 |
---|---|
오일러(Euler) phi 함수 구현하기 (0) | 2013.12.14 |
C 언어에서 동작하는 쓰레기 수집기(Garbage collector) (0) | 2013.10.19 |
이진 파일을 읽어서 16진수로 보여주는 HexView 소스 with C (0) | 2013.08.05 |
Visual C 2010 으로 컴파일하여 실행해 본 OpenGL 예제: Redbook 의 Teapots (0) | 2013.05.17 |