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


120

내가 틀렸다면 정정 해줘

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 ++의 차이점은 무엇입니까? 서로 바꿔서 사용할 수 있습니까?


32 비트 프로세서에서 실행되는 VS2005에서 int의 기본 크기는 4 바이트입니다.


이식 가능한 코드를 작성 #include <stdint.h>하려면 크기를 알려주는 유형과 사용을 고려 하십시오. 예 uint32_t. 새 플랫폼에서는 stdint.h가 특정 플랫폼에 적합하고 코드가 의도 한대로 작동하는지 확인하기 만하면됩니다.
BitTickler 2014 년

답변:


112

구현에 따라 다릅니다.

예를 들어 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  

이 답변 (예제 별 답변)을 C ++ 표준과 관련하여 아래 세부 정보와 결합하는 것을 고려해야한다고 생각합니다. C ++ 0x의 초안은 open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2798.pdf에 있으며 마크 업되어 있으므로이 문서 와 마지막 개정판의 차이점을 확인할 수 있습니다.
Patrick Johnmeyer

유형의 상대적인 크기 순서에 무언가를 포함하면 @Kevin 상태와 같이 서로 다른 플랫폼의 크기를 열거하는 것보다 더 많은 정보를 얻을 수 있습니다. (-1vote)
xtofl

2
일부 컴파일러에는 int의 기본 크기를 수정할 수있는 플래그도 있습니다. 즉, 8 또는 16 등으로 강제 설정합니다. 자세한 내용은 컴파일러 문서를 참조하세요.
Martin York

7
NB 이들의 크기임을
rogerdpack

1
int의 크기도 포함하십시오.
cegprakash

82

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

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보장됩니까?


1
흠, 이것은 유지되지 않습니다. 만약 sizeof (short)> = sizeof (char) 우리는 sizeof (short)> = 1 (> = 2가 아님) 만 알고 있습니다. btw는 모든 유형에 적용됩니다. 이 sizeof (모든 정수 유형)에 따르면> = 1입니다. 예를 들어 Z80에서 sizeof (int) == 1을 기억하지만 오래 동안 더 강력한 보증은 없습니까?
Andreas Magnusson

6
C ++ 표준의 3.9.1.2는 sizeof (long)> = sizeof (int)> = sizeof (short)> = sizeof (char)를 지정합니다. C ++ 표준의 5.3.3.1은 sizeof (char), sizeof (unsigned char)를 지정합니다. , and sizeof (signed char)는 1과 같습니다. (계속 ...)
KTC

4
(... cont) 정수 유형으로 나타낼 수있는 최대 값과 최소값은 <limits.h> (따라서 <climits>)의 매크로로 정의됩니다. C ++ 표준에서 참조로 포함 된 C (1990) 표준의 부록 E는 이러한 매크로의 최소 크기를 지정합니다. (계속 ...)
KTC

4
(... cont) 그리고 그것들은 각각 (2 ^ 15) -1, (2 ^ 15) -1, (2 ^ 31) -1입니다. CHAR_BIT가 8 (최소값이기도 함) 인 경우 Martin York이 여기에 답변을 게시했습니다.
KTC

2
@Giles : 내가 위에서 말한 것이 아니냐? sizeof (short) * CHAR_BITS> = 16. 몇 가지 다른 것들을 더합니다. :-)
Martin York

13

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

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

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


아마도 0 바이트? 흠
rogerdpack

12

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

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

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


7

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 비트가 아닙니다. 더.


byteC ++에 데이터 유형이 존재 한다고 생각하지 않았습니다 . 그렇지 않습니까? 만약 그렇다면 a byte가 8 비트가 아닌 다른 크기를 가질 수 있다면 그것은 순전히 어리석은 일입니다. 반드시 8 비트가 아니라면 왜 바이트라고 부를까요?
알데 라스

6

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


5

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

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


5

컴파일러 공급 업체의 기본 유형 크기 구현에 의존하면 다른 시스템 아키텍처, OS 또는 다른 공급 업체의 컴파일러에서 코드를 컴파일 한 경우 다시 돌아올 것입니다.

대부분의 컴파일러 공급 업체는 명시 적 유형 크기로 기본 유형을 정의하는 헤더 파일을 제공합니다. 이러한 기본 유형은 코드가 잠재적으로 다른 컴파일러로 이식 될 수있는 경우에 사용해야합니다 (이를 EVERY 인스턴스에서 ALWAYS로 읽으십시오). 예를 들어, 대부분의 UNIX 컴파일러에는 int8_t uint8_t int16_t int32_t uint32_t. Microsoft는 INT8 UINT8 INT16 UINT16 INT32 UINT32. 저는 Borland / CodeGear의 int8 uint8 int16 uint16 int32 uint32. 이러한 이름은 의도 한 값의 크기 / 범위를 약간 상기시켜줍니다.

수년 동안 저는 Borland의 명시적인 기본 유형 이름을 사용했으며 #include C / C ++ 컴파일러에 대해 이러한 이름으로 명시 적 기본 유형을 정의하기위한 다음 C / C ++ 헤더 파일 (primitive.h)을 사용했습니다 (이 헤더 파일은 실제로 모든 컴파일러이지만 Windows, UNIX 및 Linux에서 사용한 여러 컴파일러를 다루며 (아직) 64 비트 유형을 정의하지 않습니다.

#ifndef primitiveH
#define primitiveH
// Header file primitive.h
// Primitive types
// For C and/or C++
// This header file is intended to define a set of primitive types
// that will always be the same number bytes on any operating operating systems
// and/or for several popular C/C++ compiler vendors.
// Currently the type definitions cover:
// Windows (16 or 32 bit)
// Linux
// UNIX (HP/US, Solaris)
// And the following compiler vendors
// Microsoft, Borland/Imprise/CodeGear, SunStudio,  HP/UX
// (maybe GNU C/C++)
// This does not currently include 64bit primitives.
#define float64 double
#define float32 float
// Some old C++ compilers didn't have bool type
// If your compiler does not have bool then add   emulate_bool
// to your command line -D option or defined macros.
#ifdef emulate_bool
#   ifdef TVISION
#     define bool int
#     define true 1
#     define false 0
#   else
#     ifdef __BCPLUSPLUS__
      //BC++ bool type not available until 5.0
#        define BI_NO_BOOL
#        include <classlib/defs.h>
#     else
#        define bool int
#        define true 1
#        define false 0
#     endif
#  endif
#endif
#ifdef __BCPLUSPLUS__
#  include <systypes.h>
#else
#  ifdef unix
#     ifdef hpux
#        include <sys/_inttypes.h>
#     endif
#     ifdef sun
#        include <sys/int_types.h>
#     endif
#     ifdef linux
#        include <idna.h>
#     endif
#     define int8 int8_t
#     define uint8 uint8_t
#     define int16 int16_t
#     define int32 int32_t
#     define uint16 uint16_t
#     define uint32 uint32_t
#  else
#     ifdef  _MSC_VER
#        include <BaseTSD.h>
#        define int8 INT8
#        define uint8 UINT8
#        define int16 INT16
#        define int32 INT32
#        define uint16 UINT16
#        define uint32 UINT32
#     else
#        ifndef OWL6
//          OWL version 6 already defines these types
#           define int8 char
#           define uint8 unsigned char
#           ifdef __WIN32_
#              define int16 short int
#              define int32 long
#              define uint16 unsigned short int
#              define uint32 unsigned long
#           else
#              define int16 int
#              define int32 long
#              define uint16 unsigned int
#              define uint32 unsigned long
#           endif
#        endif
#      endif
#  endif
#endif
typedef int8   sint8;
typedef int16  sint16;
typedef int32  sint32;
typedef uint8  nat8;
typedef uint16 nat16;
typedef uint32 nat32;
typedef const char * cASCIIz;    // constant null terminated char array
typedef char *       ASCIIz;     // null terminated char array
#endif
//primitive.h

C99는 int32_t, uint64_t 등과 같이 보이는 typdef가 컴파일러에 의해 정의되고 이름에서 알 수있는만큼 정확하게 비트를 포함하도록 요구합니다. 대부분의 C ++ 컴파일러 (g ++ 포함)를 사용하면 C ++ 코드에서 이러한 상수를 사용할 수 있습니다.
rmeador

5

C ++ 표준 이처럼 말한다 :

3.9.1, §2 :

부호있는 정수 유형에는 "signed char", "short int", "int", "long int"및 "long long int"의 다섯 가지가 있습니다. 이 목록에서 각 유형은 목록에있는 이전 유형만큼 최소한의 스토리지를 제공합니다. Plain int는 실행 환경의 아키텍처에서 제안한 자연스러운 크기를 갖습니다 (44). 다른 부호있는 정수 유형은 특별한 요구를 충족하기 위해 제공됩니다.

(44) 즉 , 헤더에 정의 된대로 INT_MIN 및 INT_MAX 범위의 값을 포함 할만큼 충분히 큽니다 <climits> .

결론 : 작업중인 아키텍처에 따라 다릅니다. 다른 가정은 거짓입니다.

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