long long
long long은 C 언어 및 C++과 같은 시스템 프로그래밍 언어에서 사용하는 정수형 데이터 타입이다. 일반적인 int 또는 long 타입보다 더 큰 범위의 정수값을 표현할 수 있도록 설계되었으며, 대부분의 현대 시스템에서는 64비트(8바이트) 크기를 갖는다. 이 타입은 플랫폼 간 호환성, 고정 크기 정수 처리, 큰 정수 연산의 정확도 확보를 목적으로 널리 사용된다.
C 언어에서는 long long int 또는 간략하게 long long이라고 쓰며, C99 표준부터 공식적으로 도입되었다. C++의 경우도 C++11 이상에서는 이 타입을 완전히 지원한다.
목차
역사와 배경[편집]
- 초기 C의 한계
C 언어는 1970년대 초기에 개발되었으며, 원래는 하드웨어 친화적인 설계를 갖고 있었기 때문에 데이터 타입 크기도 하드웨어에 의존적이었다. 가장 일반적인 정수형인 int는 16비트 또는 32비트로 구현되었으며, long은 이보다 약간 더 큰 정수 범위를 제공했다. 하지만 수십 년이 지나면서 데이터 처리량이 급격히 증가했고, 단순한 32비트 정수로는 표현할 수 없는 수치가 많아졌다.
- C99에서의 표준화
C99에서는 이 같은 요구를 충족하기 위해 long long int 타입을 표준에 포함시켰다. 이는 최소 64비트 이상의 정수 표현 능력을 가지도록 명시되어 있다. 이는 C 프로그램이 다양한 플랫폼(32비트, 64비트 등)에서도 일관성 있게 큰 수를 다룰 수 있도록 도왔다.
크기와 표현 범위[편집]
long long 타입은 최소 64비트 크기를 갖는다고 규정되어 있다. 하지만 실제 구현은 사용하는 컴파일러와 하드웨어 아키텍처에 따라 다를 수 있다.
표현 방식 바이트 수 비트 수 부호 있음 (signed) 부호 없음 (unsigned) long long 8 64 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 0 ~ 18,446,744,073,709,551,615 long long int 8 64 동일 동일 unsigned long long 8 64 없음 위 범위 참고
참고: sizeof(long long)은 대부분의 시스템에서 8을 반환한다 (sizeof는 바이트 단위).
선언과 사용법[편집]
- 선언
c long long a; // 부호 있는 long long unsigned long long b; // 부호 없는 long long long long int c = 123456789012345; // 초기화와 함께 선언
- 리터럴 접미사
C/C++에서는 리터럴에 타입을 명확히 하기 위한 접미사(suffix)를 사용할 수 있다:
- LL 또는 ll → long long
- ULL 또는 ull → unsigned long long
c long long x = 123456789012345LL; unsigned long long y = 123456789012345ULL;
주요 특징[편집]
- 정수 오버플로 방지
int 타입은 최대 약 21억까지만 표현 가능하지만, long long은 약 ±9경까지 가능하다. 따라서 큰 수가 필요한 알고리즘(예: 피보나치, 큰 배열의 합산 등)에서는 오버플로를 방지할 수 있다.
- 정밀도 유지
double 같은 실수형은 부동소수점 오차가 있지만, long long은 정수이기 때문에 오차 없이 정확한 수치를 보장한다.
- 연산 지원
모든 기본 산술 연산자(+, -, *, /, %)는 long long에서도 동일하게 동작한다. 또한 비교 연산자와 비트 연산자도 지원된다.
입출력[편집]
- printf와 scanf 포맷
c #include <stdio.h> int main() { long long num = 123456789012345; printf("%lld\n", num); // 출력: 123456789012345 long long input; scanf("%lld", &input); // 입력값 받기 return 0; }
- %lld → long long int
- %llu → unsigned long long
long long과 기타 타입 비교[편집]
타입 크기 (비트) 값의 범위 (signed 기준) short 16 -32,768 ~ 32,767 int 32 -2,147,483,648 ~ 2,147,483,647 long 32 or 64 구현에 따라 다름 (Windows는 32비트, Linux는 64비트) long long 64 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
※ 특히 Linux와 Windows 간 long 크기 차이는 주의해야 함
플랫폼 및 컴파일러 호환성[편집]
- GCC/Clang: 완벽히 지원. sizeof(long long)은 8.
- MSVC (Microsoft Visual C++): C++11 이후 long long 지원. 이전에는 __int64 사용.
- ARM, x86, x86_64, RISC-V: 대부분에서 64비트 구현 제공.
사용 사례[편집]
- 알고리즘 대회
int로는 오버플로가 발생할 수 있는 문제(예: 큰 수의 곱셈, 누적 합 계산 등)에 자주 사용된다.
- 시스템 시간 처리
리눅스의 time_t 타입이 64비트일 경우, long long을 통해 2038년 문제(Y2038)를 회피할 수 있다.
- 파일 크기, 메모리 주소 등
fseek, ftell, malloc 등에서 큰 크기를 다루기 위해 long long을 사용한다.
관련 키워드 및 확장[편집]
- int64_t: <stdint.h>에서 제공하는 명시적 64비트 정수 (typedef long long int64_t)
- uint64_t: 부호 없는 64비트 정수
- __int64: MSVC에서 사용되는 비표준 타입 (이제는 long long으로 대체됨)
- std::int64_t: C++에서 사용하는 타입 명시 (<cstdint>)
주의사항[편집]
- 포맷 문자열 실수
c printf("%d", myLongLong); // ❌ 오류 printf("%lld", myLongLong); // ✅
정확한 포맷 지정자를 사용하지 않으면 잘못된 출력 또는 런타임 오류 발생 가능.
- C++에서의 타입 변환
C++에서는 long long과 다른 정수형 간의 암시적 변환이 일어날 수 있어 의도치 않은 동작이 발생할 수 있으므로 주의가 필요하다.
같이 보기[편집]