며칠 전에 int64 변수에 대한 문의를 받았습니다. 에프에이리눅스에서 제공하는 EZ보드는 32비트 OS를 사용하고 있는데, 64비트 정수를 사용하고 싶다는 얘기였습니다. 리눅스 일반 C 문법만 알고 있었던 저는 난감할 수 밖에 없었습니다. 그래서 답변을 미루고 방법을 찾았는데, 일반 C 문법에는 없는 "long long" 변수 타입을 제공하고 있네요. 다른 분께도 도움이 되지 않을까 해서 제가 확인한 long long 변수에 대해 간단히 소개합니다.

long long?

nt64를 문의했던 분의 요구 사항은 이렇습니다. 8바이트의 double 변수 값 중 정수 값을 다른 곳으로 넘기고 싶다는 것이죠. 그런데 문제는 double 의 정수값을 받을 마땅한 변수 타입이 없다는 것입니다. 정수형에서 가장 큰 변수 타입이 long int 이거든요. 그러나 32비트 환경에서는 long int 와 int 의 크기가 같습니다.

 

결론은 4 바이트 짜리 int로는 감당하기가 어렵다는 것입니다. 그러나 문제는 double의 최대는 1.7 e+308 값으로 정수부를 받으려면 매우 큰 크기의 정수 변수가 필요합니다. Python은 정수 변수에 대해 무한 자릿수를 제공하기 때문에 가능할지 모르지만 C 언어에서는 힘들죠.

 

그래서 다시 말씀을 나누다 보니 최대 14자리까지 보장 받았으면 좋겠다는 말씀을 주시네요. 그래서 결론은 64비트 정수 변수 타입이 필요하다는 것인데, 그렇다면 int64를 말하는 것이 되겠습니다.

 

그래서 찾아 보고 알게된 것이 long long 변수 타입입니다. 그리고 모든 변수 타입을 아래와 같이 정리 해 보았습니다.

 

변수 타입 구분 바이트 개수 비트 개수 최소 값 최대 값
char 정수 1 8 -128 127
unsigned char 정수 1 8 0 255
short int 정수 2 16 -16,384 16,383
unsigned short int 정수 2 16 0 +32,767
int 정수 4 32 -2,147,483,648 +2,147,483,647
unsigned int 정수 4 32 0 +4,294,967,295
long int 정수 4 32 -2,147,483,648 +2,147,483,647
float 실수 4 32

3.4 e-38

3.4 e+38
double 실수 8 64 1.7 e-308 1.7 e+308
long long 정수 8 64 -9223372036854775808 9223372036854775807

long long 변수 사용 예

 

위의 표를 보시면 아시겠습니다만, unsigned를 사용하지 않아도 long long 변수는 19 자리까지 사용할 수 있습니다. 그래서 15자리 수까지 테스트 해 보았습니다.

#include <stdio.h>


int main( void)
{
    long long   int_64;
    double      d_real;

    d_real  = 123456789012345.123456;               // 정수부가 15자리인 실수 값
    int_64  = d_real;

    printf( "%lld\n", int_64);                      // 문자열을 출력하기 위해 lld 를 사용

    d_real  = 999999999999999.123456;               // 모든 정수 자리를 9로 채움
    int_64  = d_real;

    printf( "%lld\n", int_64);

    int_64  = d_real * 1000;                        // 1000을 곱해서 대입

    printf( "%llu\n", int_64);
}
]$ ./sample 
123456789012345
999999999999999
999999999999999125
]$

long long 변수이다 보니, printf()로 출력하기 위해서는 %lld 를 이용해야 합니다. 이제 큰 정수 자리가 필요하시면 long long 변수를 사용해 보세요. ^^