int32, int, int32_t, int8 및 int8_t의 차이점


103

int32_t최근에 C 프로그램에서 데이터 유형 을 발견했습니다. 나는 그것이 32 비트를 저장하는 것을 알고 있지만,하지 intint32동일한 작업을 수행?

또한 char프로그램에서 사용하고 싶습니다 . int8_t대신 사용할 수 있습니까 ? 차이점은 무엇입니까?

요약하면 C에서 int32, int, int32_t, int8 및 int8_t의 차이점은 무엇입니까?

답변:


122

사이 int32int32_t, (마찬가지로 사이 int8int8_tC 표준 정의)의 차이는 매우 간단 int8_t하고 int32_t, 아무것도하지만 이름을 정의하지 않습니다 int8또는 int32- (그들은 모두 존재하는 경우) 후자는 다른 헤더 나 라이브러리에서 아마도 (가장 가능성 첨가 선행 int8_tint32_t) C99하여.

Plain int은 다른 것들과 상당히 다릅니다. 여기서 int8_tint32_t는 각각 지정된 크기를 가지고, int모든 크기> = 16 비트 일 수있다. 다른시기에 16 비트와 32 비트는 모두 상당히 일반적이었습니다 (64 비트 구현의 경우 아마도 64 비트 여야 함).

반면 int에 C의 모든 구현에는 존재 int8_t하고 int32_t존재하지 않는 것이 보장됩니다 . 이것이 당신에게 중요한지 의문의 여지가있을 것입니다. 소형 임베디드 시스템 및 / 또는 구형 컴파일러에서 C를 사용하는 경우 문제가 될 수 있습니다. 주로 데스크톱 / 서버 컴퓨터의 최신 컴파일러와 함께 사용한다면 아마 그렇지 않을 것입니다.

죄송합니다 char.에 대한 부분을 놓쳤습니다 . int8_t정수 유형이 정확히 8 비트 크기로 보장되도록하려면 char 대신 사용 합니다. 문자를 저장하려면 char대신 사용하고 싶을 것입니다. 크기는 다양 할 수 있지만 (비트 수 측면에서) 정확히 1 바이트가 보장됩니다. 하지만 한 가지 이상한 점은 일반 char이 서명 되었는지 서명되지 않았는 지에 대한 보장이 없다는 것입니다 (컴파일 타임 플래그에 따라 많은 컴파일러가 둘 중 하나를 만들 수 있습니다). 서명 여부를 확인해야하는 경우 명시 적으로 지정해야합니다.


1
@linuxfreak : 잘 모르겠습니다 bool_t-전에는 들어 본 적이 없습니다. C 표준은 _Bool내장형으로 정의 합니다. bool사용자 #include <stdbool.h>(로 확장되는 매크로) 인 경우에만 정의됩니다 _Bool.
Jerry Coffin 2013 년

5
"64 비트 구현의 경우 (int)는 아마도 64 비트 여야합니다"라고 말했습니다. 실제로 int는 Windows, Mac OS X, Linux 및 다양한 UNIX 버전을 포함한 모든 일반적인 64 비트 플랫폼에서 32 비트입니다. 한 가지 예외는 Cray / UNICOS이지만 요즘 유행하지 않습니다.
Sam Watkins 2014

6
@SamWatkins : 예, 그것이 제가주의 깊게 "그렇다"가 아니라 "되어야한다"고 말한 이유입니다. 표준은 "아키텍처에서 제안한 자연스러운 크기"라고 말합니다. (IMO)는 64 비트 프로세서에서 실제로 64 비트 여야 합니다 (더 좋든 나쁘 든간에 일반적으로 그렇지 않다는 것은 맞습니다). 티). 좀 더 실용적인 관점에서 보면 C89의 유형 중 32 비트 유형을 갖는 것이 매우 편리하며 int가 64 비트이면 long도 64 비트 이상이어야하므로 32 비트가없는 경우가 많습니다. 유형.
Jerry Coffin 2014

2
@barlop : 네. (C와 C ++ 모두 char에 대해 최소 255 개의 값 범위를 요구하므로 최소 8 비트가 필요하지만 더 많을 수 있습니다.)
Jerry Coffin

2
나는 1 바이트 정확하게 8 비트, 최대에하지 어디서나 8에서 비트 있다는 인상을 언제나
ErlVolton

18

_t 데이터 유형은 stdint.h 헤더의 typedef 유형이며 int는 내장 기본 데이터 유형입니다. 이렇게하면 stdint.h가있는 경우에만 _t를 사용할 수 있습니다. 반면에 int는 존재하는 것이 보장됩니다.


1
왜 _t를 사용합니까?
Deven

@Deven 코드가 다른 곳에서는 작동하지 않는 경우를 방지합니다.
Franklin Yu

2

명시 적으로 지정하지 않으면 'size'는 변수이므로

 int i = 10;

일부 시스템에서는 컴파일러에 의해 16 비트 정수가 될 수 있고 다른 시스템에서는 32 비트 정수 (또는 최신 시스템에서는 64 비트 정수)가 될 수 있습니다.

임베디드 환경에서는 이상한 결과가 나올 수 있으므로 (특히 메모리 매핑 된 I / O를 처리하는 동안 또는 단순한 배열 상황을 고려할 수 있음) 고정 크기 변수를 지정하는 것이 좋습니다. 레거시 시스템에서는

 typedef short INT16;
 typedef int INT32;
 typedef long INT64; 

C99부터 디자이너는 본질적으로 유사한 typedef를 활용하는 stdint.h 헤더 파일을 추가했습니다.

Windows 기반 시스템에서 stdin.h 헤더 파일의 항목을 다음과 같이 볼 수 있습니다.

 typedef signed char       int8_t;
 typedef signed short      int16_t;
 typedef signed int        int32_t;
 typedef unsigned char     uint8_t;

최소 너비 정수 또는 정확한 너비 정수 유형과 같은 것이 훨씬 더 많으므로 더 나은 이해를 위해 stdint.h를 탐색하는 것이 나쁘지 않다고 생각합니다.


1
코드에 오타가 있습니다 : typedef short INT16;, not typedefs short INT16.
Galaxy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.