문제

ISO 표준 C에서는 고정 8,16,32 및 64 비트 길이의 정수 유형에 대한 typedef를 신뢰할 수있는 방법이 있습니까?

ISO 표준 C를 말할 때, 나는 엄격하게 의미합니다.

  • C99가 아닌 ISO C89/C90.
  • ISO 표준에 정의되지 않은 헤더가 없습니다.
  • ISO 표준에 정의되지 않은 사전 처리기 기호가 없습니다.
  • ISO 표준에 지정되지 않은 유형 크기 가정이 없습니다.
  • 독점 공급 업체 기호가 없습니다.

나는 stackoverflow에서 이와 유사한 다른 질문을 볼 수 있지만, 위의 제약 중 하나를 위반하지 않는 답은 아직 없습니다. 플랫폼 기호에 의지하지 않고는 가능하지 않습니다.

도움이 되었습니까?

해결책

당신은 할 수 있습니다.

헤더 파일 limits.h C90의 일부 여야합니다. 그런 다음 전처리 지시문 값을 통해 테스트했습니다 SHRT_MAX, INT_MAX, LONG_MAX, 그리고 LLONG_MAX 그에 따라 typedef를 설정합니다.

예시:

#include <limits.h>

#if SHRT_MAX == 2147483647
typedef unsigned short int uint32_t;
#elif INT_MAX == 2147483647
typedef unsigned int uint32_t;
#elif LONG_MAX == 2147483647
typedef unsigned long uint32_t ;
#elif LLONG_MAX == 2147483647
typedef unsigned long long uint32_t;
#else
#error "Cannot find 32bit integer."
#endif

다른 팁

엄밀히 말하면, ISO 9899 : 1999는 ISO 9899 : 1990을 대체했습니다. 또한 현재 ISO 표준 C 언어 사양입니다.

정수 유형의 정확한 너비 타이핑 이름은 1999 년 버전에서 표준에만 소개되었으므로 1990 버전의 표준 만 사용하여 원하는 것은 불가능합니다.

아무것도 없습니다. 그러나 몇 가지 제한을 가지고 살고 싶다면 개별 정수 변수를 최대 32 비트의 크기로 선언하는 신뢰할 수있는 방법이 있습니다. 그냥 사용하십시오 long 비트 필드 (후자는 32 비트 너비가 보장되며 비트 필드 선언자가 생략 된 경우 변수에 맞는 비트 필드에서 많은 비트까지 최대 많은 비트를 사용할 수 있습니다). 그래서:

struct {
   unsigned long foo : 32; 
} bar;

분명히, 당신은 그러한 변수에 대한 포인터를 가질 수없는 것과 같이 그와 함께 제공되는 모든 제한을 얻습니다. 이것이 당신을 실제로 구매하는 유일한 것은 오버 플로우의 지정된 경계에서 랩 어라운드를 보장하고, 서명되지 않은 유형에 대해서만 오버플로가 서명되지 않기 때문에.

그 외에도 순수한 C90에서는 휴대용 방법이 없습니다. 무엇보다도 적합한 C90 구현에는 8 비트 정수가있을 필요가 없습니다. sizeof(char) == sizeof(short) == sizeof(int) == 1 그리고 CHAR_BIT == 16 (즉, 16 비트 기계 단어가 있으며 개별 바이트를 다룰 수 없습니다). 나는 그러한 플랫폼이 실제로 일부 DSP의 형태로 실제로 존재한다고 들었습니다.

최신 컴파일러를 사용할 때 이러한 접근 방식의 위험은 컴파일러가 하나의 정수 유형의 포인터가 다른 사람의 값에 액세스하는 데 사용되지 않는다고 가정하는 것이 유행이된다는 것입니다. 두 유형 모두 크기와 표현이 같은 경우에도. 두 가지 유형이 동일한 크기와 표현을 갖고 동일한 프로그램의 두 부분이 각각 하나를 선택하면 해당 데이터에 포인터를 공유하는 프로그램에 링크 시간 최적화를 적용합니다. 많은 시스템에서 일부 구현의 경우, 해당 크기의 모든 정수 값에 안전하게 사용할 수있는 포인터를 선언하는 것이 불가능한 정수 크기가 하나 이상 있습니다. 예를 들어 둘 다 시스템에서 long 그리고 long long 64 비트이며, 상호 교환 적으로 어느 유형의 데이터에 액세스하는 데 안정적으로 사용될 수있는 포인터를 선언 할 수있는 방법은 없습니다.

아니, 당신은 그렇게 할 수 없습니다.

이제 GNU와 같은 다단 단계 구성 프로세스를 계산하려면 configure 해결책으로, 당신은 그렇게하고 C89를 고수 할 수 있습니다. 그리고 그것을 사용할 수있는 다양한 유형이 있습니다. ~이다 C89에서는 오늘날 거의 모든 구현에서 DTRT가 될 것이므로 원하는 크기를 얻고 순수한 준수 C89를 고수합니다. 그러나 비트 너비는 일반적으로 표준에 의해 지정되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top