C ++에서 “long”, “long long”, “long int”및 “long long int”의 차이점은 무엇입니까? long데이터 형식과 수정자인 것 같습니다 . 사용하는

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;

등등.

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



답변

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해당 유형에 대해 값의 수퍼 세트를 제공해야합니다 ( 적어도 더 많은 값은 아니지만 해당 값을 의미 함 ).


답변

long 및 long int는 32 비트 이상입니다.

long long 및 long long int는 64 비트 이상입니다. c99 컴파일러 이상을 사용해야합니다.

긴 복식은 조금 이상합니다. 자세한 내용은 Wikipedia에서 찾으십시오.


답변

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.


답변

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

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

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

long== long int.

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


답변

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

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

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


답변

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>있습니다.