콘텐츠로 이동

정수 타입 (Integer Types)

내장된 C++ 정수 유형 중 유일하게 사용되는 것은 int 입니다. 프로그램에 다른 크기의 정수 유형이 필요한 경우 의 정확한 너비 정수 유형(예: int16_t )을 사용하세요. 2^31보다 크거나 같을 수 있는 값이 있는 경우 int64_t 와 같은 64비트 유형을 사용하십시오. 값이 int 에 비해 너무 크지 않더라도 더 큰 유형이 필요할 수 있는 중간 계산에 사용될 수 있다는 점을 명심하세요. 확실하지 않은 경우 더 큰 유형을 선택하십시오.

C++에서는 int와 같은 정수 유형에 대해 정확한 크기를 지정하지 않습니다. 현대 아키텍처의 일반적인 크기는 short 의 경우 16비트, int의 경우 32비트, long의 경우 32 또는 64비트, long long의 경우 64비트이지만, 특히 long의 경우 플랫폼마다 선택이 다릅니다.

선언의 통일성.

C++의 정수 유형 크기는 컴파일러와 아키텍처에 따라 달라질 수 있습니다.

표준 라이브러리 헤더 는 int16_t , uint32_t , int64_t 등과 같은 유형을 정의합니다. 정수 크기에 대한 보장이 필요할 때 항상 short , unsigned long long 등보다 이러한 유형을 우선적으로 사용해야 합니다. 내장된 정수형 중 int만 사용해야 합니다. 적절한 경우 size_t 및 ptrdiff_t와 같은 표준 유형 별칭을 사용할 수 있습니다.

우리는 루프 카운터와 같이 너무 크지 않을 것으로 알고 있는 정수에 대해 int를 매우 자주 사용합니다. 그런 일에는 일반 오래된 int를 사용하십시오. int가 32비트 이상이라고 가정해야 하지만 32비트를 초과한다고 가정하지 마세요. 64비트 정수 유형이 필요한 경우 int64_t 또는 uint64_t 를 사용하세요.

우리가 알고 있는 "큰" 정수의 경우 int64_t 를 사용하세요.

숫자가 아닌 비트 패턴을 나타내는 것과 같은 타당한 이유가 있거나 2^N 모듈로 오버플로를 정의해야 하는 경우가 아니면 uint32_t 와 같은 부호 없는 정수 유형을 사용해서는 안 됩니다. 특히, 숫자가 결코 음수가 될 수 없다고 말하기 위해 부호 없는 유형을 사용하지 마세요. 대신 이를 위해 어설션을 사용하세요.

표준 라이브러리 정수 유형에서는 std:: 접두사를 생략하는 것이 좋습니다. 추가 5자는 추가된 혼란을 야기할 가치가 없기 때문입니다.

코드가 크기를 반환하는 컨테이너인 경우 컨테이너의 가능한 모든 용도를 수용할 수 있는 유형을 사용해야 합니다. 확실하지 않은 경우 작은 유형보다는 더 큰 유형을 사용하십시오.

정수 유형을 변환할 때는 주의하세요. 정수 변환 및 승격으로 인해 정의되지 않은 동작이 발생하여 보안 버그 및 기타 문제가 발생할 수 있습니다.

부호 없는 정수는 비트 필드 및 모듈식 산술을 나타내는 데 적합합니다. 역사적 사고로 인해 C++ 표준에서는 컨테이너 크기를 나타내기 위해 부호 없는 정수도 사용합니다. 표준 기관의 많은 구성원은 이것이 실수라고 생각하지만 현 시점에서 수정하는 것은 사실상 불가능합니다. 부호 없는 산술이 단순 정수의 동작을 모델링하지 않고 대신 모듈식 산술(오버플로/언더플로에 대한 래핑)을 모델링하기 위해 표준에 의해 정의된다는 사실은 상당한 종류의 버그가 컴파일러에서 진단될 수 없음을 의미합니다. 다른 경우에는 정의된 동작이 최적화를 방해합니다.

즉, 정수 유형의 부호를 혼합하면 똑같이 큰 문제가 발생합니다. 우리가 제공할 수 있는 최선의 조언은 포인터와 크기 대신 반복자와 컨테이너를 사용하고, 부호 있는 유형을 혼합하지 말고, 부호 없는 유형을 피하는 것입니다(비트 필드 또는 모듈식 산술 표현 제외). 단순히 변수가 음수가 아니라는 것을 주장하기 위해 부호 없는 유형을 사용하지 마세요.


이해하기 쉽게 설명하기

핵심: 기본은 int, 정확한 크기가 필요하면 <cstdint>

내장 정수 타입 중 평소엔 int 쓰세요. C++ 표준은 int/long 등의 정확한 크기를 보장하지 않지만, int는 최소 32비트라고 가정해도 됩니다(그 이상은 가정 금지).

크기가 중요할 때

  • 정확한 너비가 필요하면 <cstdint>int16_t, uint32_t, int64_t 등을 쓰세요.
  • 값이 2³¹ 이상일 수 있으면 int64_t 같은 64비트 타입. 중간 계산에서 커질 수 있다는 점도 고려하세요. 애매하면 큰 타입.
  • size_t, ptrdiff_t 같은 표준 별칭은 적절히 사용. 표준 정수 타입에선 std:: 접두사를 생략해도 됩니다.

부호 없는(unsigned) 타입을 피하라

uint32_t 같은 부호 없는 타입은 비트 패턴이나 모듈로 산술을 표현할 때만 쓰세요. "음수가 될 수 없다"는 이유로 쓰지 마세요(그건 어설션으로). 부호 없는 산술은 오버플로 시 래핑(wrap)으로 정의되어, 컴파일러가 못 잡는 버그를 만듭니다. 부호를 섞는 것도 문제이니, 포인터+크기 대신 반복자+컨테이너를 쓰는 편이 낫습니다.