uint32, int32, uint64, int64와 같은 유형이 stdlib 헤더에 정의되어 있습니까?


94

나는 종종 uint32, uint64와 같은 유형을 사용하는 소스 코드를보고, 프로그래머가 애플리케이션 코드에서 정의해야하는지 아니면 표준 lib 헤더에서 정의해야하는지 궁금합니다.

내 애플리케이션 소스 코드에 이러한 유형을 포함하는 가장 좋은 방법은 무엇입니까?

답변:


135

C99 stdint.h는 다음을 정의합니다.

  • int8_t
  • int16_t
  • int32_t
  • uint8_t
  • uint16_t
  • uint32_t

그리고 아키텍처가 지원하는 경우 :

  • int64_t
  • uint64_t

다른 다양한 정수 typedef stdint.h도 있습니다.

C99 환경없이 멈춘다면 아마도 고유 한 typedef를 제공하고 어쨌든 C99를 사용해야합니다.

uint32하고 uint64(즉,없는 _t접미사) 아마 응용 프로그램에만 적용됩니다.


16
이 대답은 틀 렸습니다. 위의 모든 내용은 해당 크기의 정확한 너비 유형 (패딩 없음)이 구현에있는 경우에만 사용할 수 있습니다. 심지어하지 않을 경우, 그러나, 유형 int_leastNN_tuint_leastNN_t위해 NN8, 16, 32, 64는 항상 존재해야합니다 . C99는 64 비트 이상의 정수 유형이없는 구현을 허용하지 않습니다 long long.는 그 크기 이상이어야하기 때문입니다.
R .. GitHub STOP HELPING ICE

@R .. : "C99 stdint.h"가 아니라 "POSIX stdint.h"라고 말하는 것이 정확합니까?
mu는 너무 짧습니다.

1
POSIX stdint.h에는 모두 필요합니다.
R .. GitHub STOP HELPING ICE

1
@R .., 정확성을 위해이 답변을 편집 할 수 있습니까? 현재 콘텐츠와 댓글의 조합을 분석하는 데 약간의 시간이 걸렸습니다.
merlin2011

SDL은 별칭을 같은 별칭 정의 typedef uint32_t Uint32;(당신이 SDL 사용자 인 경우) / SDL_stdinc.h을 포함에
Et7f3XIV

10

이러한 정수 유형은 모두 stdint.h


아닌가 stdint.h구현 고유은? 또한 볼 이 질문이 질문에
크리스 프레드릭

3
파일을 보면 주석에서 "ISO C99 : 7.18 Integer types <stdint.h>"를 찾았습니다. 나는 stdint.h당신이 C99 표준을 존중한다면 얻을 것이라고 생각합니다 .
philix

에서 찾을 수 없습니다 stdint.h. 이것은 0 개의 적중을 반환합니다 : grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t.
jww

1
@jww : 제 경우에는 해당 파일에이 포함되어 #include "stdint-gcc.h"있으며 해당 파일을 grepping 하면 정의가 생성됩니다.
빅터 Zamanian

1
@jww 예, 그들은 존재하지 않습니다. 표준이고 정의해야하는 유일한 것은 _t위의 답변에 나열된 접미사 가있는 것입니다 .
Victor Zamanian

2

C99를 사용하는 경우 stdint.h. BTW, 프로세서가 지원하는 경우 64 비트 유형이 있습니다.


이와 관련하여 무언가를 인용하십시오.
BiGYaN

6
x86은 64 비트 수학을 지원하지 않지만 64 비트 유형이 있습니다.
R .. GitHub STOP HELPING ICE

2
네 그렇습니다. 32 비트 x 32 비트-> 64 비트 곱하기, 64 비트 / 32 비트-> 32 비트 몫 및 32 비트 나머지 나누기를 지원하며 빌림 명령으로 캐리 및 빼기로 더하기를 지원합니다. 8086이 32 비트 산술을 수행 할 수 있어야했기 때문에 64 비트 산술을 수행 할 수 있도록 제작되었습니다.
마이클 모리스

16 이상으로 정의 된 uint128_tif 도 있습니다 __SIZEOF_INT128__(GCC 및 호환 가능). x86_64 / amd64 시스템에서 사용할 수 있지만 프로세서는 기본적으로 지원하지 않습니다. Cray만이 레지스터 크기 인 IIRC를 가지고 있습니다.
jww

0

질문자는 실제로 int16_t (등)보다는 int16 (등)에 대해 물었습니다.

표준 헤더는 없으며 "_t"없이 정의하는 Linux의 / usr / include / 폴더도 없습니다.

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