[c++] C ++에서 int와 long의 차이점은 무엇입니까?

내가 틀렸다면 정정 해줘

int는 4 바이트이며 -2,147,483,648에서 2,147,483,647 (2 ^ 31) 사이
의 값 범위는 4 바이트이며 -2,147,483,648에서 2,147,483,647 (2 ^ 31) 사이의 값 범위는 4 바이트입니다.

C ++의 차이점은 무엇입니까? 서로 바꿔서 사용할 수 있습니까?



답변

구현에 따라 다릅니다.

예를 들어 Windows에서는 동일하지만 Alpha 시스템에서는 long이 64 비트 인 반면 int는 32 비트입니다. 이 문서 에서는 가변 플랫폼에서 인텔 C ++ 컴파일러에 대한 규칙을 다룹니다. 요약:

  OS           arch           size
Windows       IA-32        4 bytes
Windows       Intel 64     4 bytes
Windows       IA-64        4 bytes
Linux         IA-32        4 bytes
Linux         Intel 64     8 bytes
Linux         IA-64        8 bytes
Mac OS X      IA-32        4 bytes
Mac OS X      Intel 64     8 bytes  


답변

유일한 보장은 다음과 같습니다.

sizeof(char) == 1
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

// FROM @KTC. The C++ standard also has:
sizeof(signed char)   == 1
sizeof(unsigned char) == 1

// NOTE: These size are not specified explicitly in the standard.
//       They are implied by the minimum/maximum values that MUST be supported
//       for the type. These limits are defined in limits.h
sizeof(short)     * CHAR_BIT >= 16
sizeof(int)       * CHAR_BIT >= 16
sizeof(long)      * CHAR_BIT >= 32
sizeof(long long) * CHAR_BIT >= 64
CHAR_BIT         >= 8   // Number of bits in a byte

참조 : 최소 32 비트 long보장됩니까?


답변

x64 용으로 컴파일 할 때 int와 long의 차이는 사용하는 컴파일러에 따라 0 ~ 4 바이트입니다.

GCC는 LP64 모델을 사용합니다. 즉, int는 32 비트이지만 long은 64 비트 모드에서 64 비트입니다.

예를 들어 MSVC는 LLP64 모델을 사용하므로 64 비트 모드에서도 int와 long이 모두 32 비트입니다.


답변

C ++ 사양 자체 (이것에 대한 이전 버전하지만 충분한)이 개방을 떠난다.

부호있는 정수 유형에는 ‘ signed char‘, ‘ short int‘, ‘ int‘및 ‘ long int‘의 네 가지가 있습니다 . 이 목록에서 각 유형은 목록에있는 이전 유형만큼 최소한의 스토리지를 제공합니다. Plain int는 실행 환경의 아키텍처에서 제안한 자연스러운 크기를 갖습니다 *.

[각주 : 즉, 헤더에 정의 된대로 INT_MIN 및 INT_MAX 범위의 값을 포함 할만큼 충분히 큽니다 <climits>. — foonote 끝]


답변

Kevin Haines가 지적했듯이 int는 INT_MIN 및 INT_MAX에 맞아야하는 실행 환경에서 제안한 자연 크기를 갖습니다.

C89 표준 UINT_MAX은 최소 2 ^ 16-1, USHRT_MAX2 ^ 16-1 및 ULONG_MAX2 ^ 32-1 이어야한다고 명시합니다 . 이는 short 및 int의 경우 최소 16, long의 경우 32의 비트 수를 만듭니다. char의 경우 최소한 8 비트 ( CHAR_BIT)를 가져야한다고 명시합니다 . C ++는 limits.h 파일에 대한 이러한 규칙을 상속하므로 C ++에서는 해당 값에 대해 동일한 기본 요구 사항이 있습니다. 당신은 그러나해야 하지 그 INT 적어도 2 바이트임을에서 파생. 이론적으로 char, int 및 long은 모두 1 바이트 CHAR_BIT가 될 수 있습니다. 이 경우 최소 32 비트가되어야합니다. “byte”는 항상 char 크기이므로 char가 더 크면 바이트는 8 비트가 아닙니다. 더.


답변

컴파일러에 따라 다릅니다. long은 적어도 int만큼 클 것이라고 보장되지만 더 이상 보장되지는 않습니다.


답변

대부분의 경우 바이트 수와 값 범위는 C ++가 아닌 CPU 아키텍처에 의해 결정됩니다. 그러나 C ++는 최소 요구 사항을 설정하여 litb가 제대로 설명했고 Martin York은 몇 가지 실수 만했습니다.

int와 long을 같은 의미로 사용할 수없는 이유는 항상 같은 길이가 아니기 때문입니다. C는 바이트가 8 비트이고 int가 2 바이트이며 하드웨어 명령으로 직접 처리 할 수있는 PDP-11에서 발명되었습니다. C 프로그래머는 종종 4 바이트 산술이 필요했기 때문에 long이 발명되었고 라이브러리 함수에 의해 처리되는 4 바이트였습니다. 다른 기계는 사양이 다릅니다. C 표준은 몇 가지 최소 요구 사항을 부과했습니다.