[c] int32, int, int32_t, int8 및 int8_t의 차이점

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

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

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



답변

사이 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이 서명 되었는지 서명되지 않았는 지에 대한 보장이 없다는 것입니다 (컴파일 타임 플래그에 따라 많은 컴파일러가 둘 중 하나를 만들 수 있습니다). 서명 여부를 확인해야하는 경우 명시 적으로 지정해야합니다.


답변

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


답변

명시 적으로 지정하지 않으면 ‘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를 탐색하는 것이 나쁘지 않다고 생각합니다.


답변