C ++에서 "long", "long long", "long int"및 "long long int"의 차이점은 무엇입니까?


209

Java에서 C ++로 전환 중이며 long데이터 유형 에 대한 질문이 있습니다. Java에서 2 32 보다 큰 정수를 유지하려면 간단히 씁니다 long x;. 그러나 C ++에서는 long데이터 형식과 수정자인 것 같습니다 .

사용하는 몇 가지 방법이있는 것 같습니다 long.

long x;
long long x;
long int x;
long long int x;

또한 다음과 같은 것이 있습니다.

long double x;

등등.

이러한 다양한 데이터 유형의 차이점은 무엇이며 모두 동일한 목적을 가지고 있습니까?



2
@ user2612743-안전을 위해 요구 사항이 무엇인지 생각하고 적절한 유형을 사용하십시오. long long보다 느릴 long수 있습니다 int. 보다 느릴 수 있습니다 .
피트 베커


1
아니요, "안전하고 오래 오래 사용하십시오"는 "안전하고 모든 사람에게 지구 에이즈를 제공하기 때문에 안전성에 대해 걱정할 필요가 없습니다. 바보 야? 데이터와 가능한 값에 대해 생각하고 가장 적합한 유형을 사용하십시오. 또한 타겟 플랫폼의 자연 비트 폭보다 큰 숫자를 처리하기 위해 추가 라이브러리를로드해야하는 경우와 같이 컴파일러가 원래 코드 의도를 손상시키지 않으면 서 추가 최적화를 수행하는 데 도움이됩니다.
CM

win32 목록 상자와 함께 long long을 사용하면 한계를 위반하지 않더라도 메모리 및 기타 변수에 혼란을 일으키지 않습니다. 무해한 C4244 경고가 있어도 감지하기 쉽지 않습니다.
Laurie Stearn

답변:


182

longlong int동일하다. 그래서 있습니다 long longlong long int. 두 경우 모두 int는 선택 사항입니다.

두 세트 사이의 차이와 같이, C ++, 각 표준 위임 최소 범위 및 그 long long있어요 최소 폭만큼 long.

표준의 제어 부분 (C ++ 11이지만 오랫동안 사용되어 왔음)은 3.9.1 Fundamental types섹션 2입니다 (나중 섹션은 부호없는 정수 유형에 대해 유사한 규칙을 제공합니다).

부호있는 char, short int, int, long int 및 long long int의 5 가지 표준 부호있는 정수 유형이 있습니다. 이 목록에서 각 유형은 목록에서 이전 유형보다 최소한 많은 스토리지를 제공합니다.

또한 표 9에 표 9가 있는데 7.1.6.2 Simple type specifiers, 이는 실제 유형에 대한 지정자의 "매핑"을 보여줍니다 ( int이 옵션은 선택 사항 임). 섹션은 다음과 같습니다.

Specifier(s)         Type
-------------    -------------
long long int    long long int
long long        long long int
long int         long int
long             long int

지정자와 유형 사이의 차이점에 유의하십시오. 지정자는 컴파일러에게 유형이 무엇인지 알려주는 방법이지만 다른 지정자를 사용하여 같은 유형으로 끝날 수 있습니다.

따라서 long자체적으로 질문이 제기 하는 유형 이나 수정자가 아니며 단순히 long int유형 의 지정자입니다 . 타입 long long의 지정자 인 Dittolong long int

C ++ 표준 자체는 적분 유형의 최소 범위를 지정하지는 않지만 C99 1.2 Normative references를 적용 할 때 인용 합니다. 따라서 설정 한 최소 범위를 C99 5.2.4.2.1 Sizes of integer types <limits.h>적용 할 수 있습니다.


의 관점에서 long double, 그것은 실제로 정수가 아닌 부동 소수점 값입니다. 적분 유형과 마찬가지로 적어도 a만큼 정밀도를 가져야하고 double해당 유형에 대해 값의 수퍼 세트를 제공해야합니다 ( 적어도 더 많은 값은 아니지만 해당 값을 의미 함 ).


4
같은 일을 가진 unsignedunsigned int

2
나는 long적어도 32 비트 (0의 양쪽에 2 ^ 31-1)이고 long long적어도 64 (양쪽에 2 ^ 63-1 ) 라고 확신 합니다.
chris

2
그리고 long double의 범위는 적어도 보장 double되지만 동일 할 수 있습니다. 컴퓨터에 따라 다릅니다. 일부 FPU는 정밀도가 향상되었습니다. x87 칩은 32 비트 단 정밀도, 64 비트 배정 밀도 및 80 비트 확장 정밀도를 가졌습니다.
Eric Jablow

범위 요구 사항과 관련하여 C ++ 11 표준은 실제 범위가있는 C11 표준을 참조합니다.
chris

"int"부분은 정수 유형과 부동 소수점, 문자 또는 다른 비정 수 유형을 단순히 구별합니다. 대부분의 경우 컴파일러에서이를 유추 할 수 있으므로 제거 할 수 있습니다. 예를 들어 "부호없는"이 "부호없는 int"와 같은 이유입니다. "int"부분은 프로그래머가 "char"또는 "double"과 같은 다른 것을 지정하지 않는 한 간단히 가정됩니다. 당신이 읽을 수있는 표준에 따라 사용되는 실제 크기 ...에 관해서는, 각각의 크기는 비트의 최소 번호를 가질 수 있지만 그들은 모두 각이되도록 정의하고 적어도 이전의 형식으로 대형으로.
CM


17

long에 해당 long int다만, short동일합니다 short int. A long int는 32 비트 이상인 부호있는 정수 유형 이고 a long long또는 long long int부호있는 정수 유형은 64 비트 이상 입니다.

이것이 반드시 a long long보다 넓은 것을 의미하지는 않습니다 long. 많은 플랫폼 / ABI가이 LP64모델을 사용합니다. 여기서 long(및 포인터)의 폭은 64 비트입니다. 이 Win64를 사용하는 LLP64곳은, long여전히 32 비트이며, long long(그리고 포인터) 전체 64 비트이다.

여기에 64 비트 데이터 모델이 요약되어 있습니다 .

long double적어도 너비만큼 넓을 것 이외의 많은 것을 보장하지는 않습니다 double.


7

long데이터 유형 자체로 사용 하기 때문에 혼란스러워 보입니다 .

longlong int혼자 사용할 때 의 속기 일뿐 입니다.

long수정 자이므로로 사용할 double수도 있습니다 long double.

long== long int.

둘 다 4 바이트를 사용합니다.


오래 걸리는 4 바이트는 Win64에서만 유효하며 플랫폼에 따라 다릅니다.
Prodigle

1
예, 분명히 ... 긴뿐만 아니라 ... int는 4 바이트를 차지하고 2 바이트는 플랫폼에 따라 다릅니다.
Siraj Alam

3

역사적으로 프로세서가 8 비트 또는 16 비트의 워드 길이 int를 갖는 초기 C 시대에는 오늘날 short(16 비트) 과 동일했습니다 . 어떤 의미에서, int는 비트 폭 char에 대해 확신 할 수 없으므로 short, long또는 보다 더 추상적 인 데이터 유형 long long입니다.

정의 int n;할 때 이것을 "n에 대해이 시스템에서 비트 폭과 속도의 최상의 절충안을 부여하십시오"로 번역 할 수 있습니다. 미래에는 컴파일러 int가 64 비트로 변환 될 것으로 예상해야합니다 . 따라서 변수에 32 비트 이상이 필요하지 않은 경우 명시 적을 long데이터 유형 으로 사용하는 것이 좋습니다 .

[편집 : #include <stdint.h>아직 표준의 일부는 아니지만 int ## _ t 유형을 사용하여 비트 폭을 보장하는 적절한 방법 인 것 같습니다.]


2
int가 64 비트 일 때 "long"을 사용하여 32 비트를 얻는 마지막 부분은 올바르지 않습니다. INT가 64 비트 인 경우, 긴 것 이상 뿐만 아니라 64 비트. Long은 적어도 int만큼 클 수 있지만 더 클 수는 있지만 더 작지는 않습니다. 대부분의 컴파일러에는 프로그래머가보다 구체적으로 지정할 수있는 다양한 방법이 있습니다 (예 : 정확히 32 비트 인 이식 할 수없는 __int32 유형 등).
CM

1
C 표준에 정의 된대로 a long는 32 비트 이상이어야 합니다. 현재의 C ++ 14 초안은 다음과 같이 말합니다 : @CM "일반 정수는 실행 환경의 아키텍처에 의해 제안 된 자연적인 크기를 가지고 있습니다. 다른 부호있는 정수 유형은 특별한 요구를 충족시키기 위해 제공됩니다"(섹션 3.9.1 ). 다양한 int의 길이 관계에 대한 단어를 찾지 못했습니다. __int32는 실제로 표준의 일부는 아니지만 C ++ 11부터 int_fast32_t 또는 int_least32_t와 같은 typedef를 사용하여 원하는 것을 정확하게 얻을 수 있습니다.
thomiel

나는 범용 재 프로그래밍 가능한 마이크로 컴퓨터를위한 20 세기 구현 char에서 거의 만장일치로 8 비트, short16, long32가 되었다고 말하고 싶다 . int일부 플랫폼 (예 : 68000)의 경우 16 비트와 32 비트 int모두 매우 일반적이며 일부 컴파일러에는 둘 중 하나를 지원하는 옵션이 있습니다. 따라서 이식성이 필요한 코드는를 사용 short하거나 long선호하는 것으로 예상 되었습니다 int.
supercat

0

Java에서 a long는 항상 64 비트이지만 C ++에서는 컴퓨터 아키텍처 및 운영 체제에 따라 다릅니다 . 예를 들어, a long는 Linux에서 64 비트이고 Windows에서 32 비트입니다 (이는 이전 버전과의 호환성을 유지하기 위해 수행되었으므로 32 비트 프로그램은 64 비트 Windows에서 변경없이 컴파일 할 수 있습니다).

피하고 short int long ... 대신 사용 하는 것이 좋은 C ++ 스타일로 간주됩니다 .

std::int8_t   # exactly  8 bits
std::int16_t  # exactly 16 bits
std::int32_t  # exactly 32 bits
std::int64_t  # exactly 64 bits

std::size_t   # can hold all possible object sizes, used for indexing

이 ( int*_t)는 <cstdint>헤더를 포함시킨 후에 사용할 수 있습니다 . size_t<stdlib.h>있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.