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;
등등.
이러한 다양한 데이터 유형의 차이점은 무엇이며 모두 동일한 목적을 가지고 있습니까?
답변
long
과 long int
동일하다. 그래서 있습니다 long long
와 long 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
데이터 유형 자체로 사용 하기 때문에 혼란스러워 보입니다 .
long
long 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>
있습니다.