2009-10-23 4 views
9

C 언어의 사양이 각 정수 유형의 정확한 크기를 지정하지 않는다는 것을 알고 있습니다 (예 : int).다른 아키텍처에서의 C 언어의 크기

궁금한 점은 : C (C++이 아님)가 다른 아키텍처에서 동일하게 유지 될 수 있도록 특정 크기의 정수 유형을 정의하는 방법이 있습니까? Like :

typedef int8 <an integer with 8 bits> 
typedef int16 <an integer with 16 bits> 

또는 다른 아키텍처에서 프로그램의 다른 부분을 컴파일 할 수있는 다른 방법.

+1

질문이 http://stackoverflow.com/questions/126279/c99-stdint-h-header-and-ms-visual-studio –

+2

@zilgo와 매우 비슷합니다. 답변은 비슷할 수 있습니다. 질문은 그렇지 않다. 126279 년, OP는 이미 stdint.h를 알고 있습니다. NawaMan (분명히)은 질문 할 때 아니었다. –

+2

마지막 가정은 잘못되었습니다. int 크기의 차이가 다른 아키텍처의 컴파일을 반드시 차단하는 것은 아니지만 'i == i & 0xFFFFFFFF'와 같은 잠정적 가정이 될 수 있습니다. 좋은 프로그래머는 2^16의 법칙을 원할 때'& 0xFFFF'를 쓰고'unsigned short'가 정확히 16 비트인지는 신경 쓰지 않습니다. – MSalters

답변

15

을 당신이 원하는 것은 <stdint.h>, C 표준 ("C99")에 적합 컴파일러 구현하는 것입니다 . 불행히도 여기에는 Microsoft가 포함되어 있지 않습니다. 다행히도 오픈 소스 프로젝트는 Windows 용 <stdint.h>을 제공합니다 (msinttypes 참조).

이렇게하면 int32_tuint32_t에 8,16,64 등을 사용할 수 있습니다.

참고 : 헤더 파일 자체는 표준에서는 선택 사항이 아니지만 대부분 헤더의 유형은 개별적으로 선택 사항입니다. 일부는 그렇지 않습니다. 가장 일반적으로 사용되는 유형은 선택 사항이지만 필요한 유형을 사용하지 못하게하는 유형은 없습니다. 구현이 헤더를 전혀 제공하지 않는다면 실제로는 모든 유형을 정의합니다.

+0

즉, 항상 C99 컴파일러로 코드를 컴파일하고 항상 을 포함하면 int32_t가 항상 4 바이트인지 확인해야합니다. – NawaMan

+0

@ NawaMan -'int32_t'는 정확히 32 비트를 가질 것입니다. 플랫폼이 32 비트 int 타입을 가지고 있지 않으면'int32_t' 타입이 정의되지 않기 때문에 컴파일이 실패합니다. 또한 많은 비 C99 컴파일러가 'stdint.h'를 제공합니다. - Microsoft가 아닌 다른 컴파일러는 http://snipplr.com/view/와 같은 다른 주석/응답을 가리키는 여러 곳에서 하나를 얻을 수 있습니다. 18199/stdinth/ –

+0

@NawaMan : 예. 또한 C99에서는 int> = 16, long> = 32, long long> = 64와 같이 기본 유형에 대한 최소값을 제공합니다. – DigitalRoss

13

C99는 stdint.h이며 int8_tint16_t과 같은 유형을 정의합니다.

+0

나는 C99에도 부합하지 않는 많은 다른 플랫폼을 다루는 버전이 있다고 생각하지만 확실하지 않습니다. –

+0

MSVC는 ''을 좋아하지 않습니다. 내가 신경 쓰지 않는다면, 나는 끔찍한 코드 - gen 때문에 그것을 사용하지 않았다. – LiraNuna

+0

그건 재미 있어요. stdint.h 또는 cstdint가 없거나 해당 비트 폭을 가진 유형을 지원하더라도 int16_t가 없다는 것을 말하고 있습니까? 그것은 내가 생각하기에, 그것을 부적합하게 만들고, 나는 MS가 그 바보가 될 것이라고 생각하지 않을 것입니다. – paxdiablo

2

각 플랫폼을 #ifdef 또는 그 이상으로 확인하지 않으면 쉽게 불가능할 것입니다. 그러나 많은 도서관들이 이미 당신을 위해 그 일을하고 있습니다. MSVC는 __int8, __int16, &c.입니다. GTK 라이브러리에는 비슷한 typedef가 있습니다.

2

내가 아는 한 대답은 아니오입니다. 다른 플랫폼 용으로 코드를 작성하고 # if/# else를 사용하여 특정 플랫폼 용 typedef를 사용합니다. 예를 들어 Win32의 경우 : typedef int int32;

감사합니다,

Sebastiaan

5

가 아니, C 표준은 정수형의 최소 크기를 지정하지만 최대 크기에 대한 보장을하지 않습니다.

해당 크기의 유형을 사용할 수있는 경우 구현시 intN_t 유형을 제공해야합니다. 나는 당신이 크로스 플랫폼 태그를 가지고 있기 때문에 언급한다. 정확한 비트 너비의 타입을 가지지 않는 구현체는 그 타입을 제공 할 필요가 없다.

특정 비트 크기에 사용할 올바른 유형을 일반적으로 선택할 수 있습니다 (예 : cc -D_INT16_IS_INT#ifdef으로 설정). CHAR_BITsizeof()을 사용하여 C 코드로 지원하려는 각 플랫폼에 필요한 정의를 만들 수 있습니다.

c1x 드래프트 (n1362)의 관련 부분은 :


7.18.1.1 정확한 폭 정수형

  1. typedef입니다 이름 intN_t은 부호있는 정수 타입을 나타낸다 폭 N, 패딩 비트 없음, 2의 보수 표현. 따라서 int8_t은 너비가 정확히 8 비트 인 부호있는 정수 유형을 나타냅니다.

  2. typedef 이름 uintN_t은 너비가 N 인 부호없는 정수 유형을 지정합니다. 따라서 uint24_t은 너비가 정확히 24 비트 인 부호없는 정수 유형을 나타냅니다.

  3. 이러한 유형은 선택 사항입니다. 그러나 구현시 8, 16, 32 또는 64 비트의 너비를 갖는 정수 유형과 2의 보수 표현을 갖는 (부호가있는 유형의 경우) 패딩 비트를 제공하는 경우 해당 유형 정의 된 이름을 정의해야합니다.유형의 선택에 대해서는


, 이런 일이 충분해야합니다

#ifdef INT32_IS_SHORT 
    typedef short INT32 
#endif 
#ifdef INT32_IS_INT 
    typedef int INT32 
#endif 
#ifdef INT32_IS_LONG 
    typedef long INT32 
#endif 
+2

시스템이 정확한 크기를 가지고 있지 않을 때 실패하고 싶다면'int8_t' 또는'int16_t'을 사용하십시오 - 시스템에 조건 코드가 없어도 빌드가 실패합니다. 실패하지 않으려면 대신에 다음 유형을 사용하려면 int_least8_t 또는 int_least16_t를 사용하십시오. –

+1

전처리 기는'sizeof()'를 평가할 수 없습니다. –

+0

C99 표준에 따르면 길이는 16 비트 이상이어야합니다.) –

0

숫자에 부호없는 문자 벡터를 사용하는 산술 라이브러리를 작성할 수 있습니다. 그렇게하면 원하는 비트 길이를 사용할 수 있고 심지어 비트 길이를 다양하게 할 수 있습니다.

실제로, GNU MP가 이미이 라이브러리를 처리하기 때문에 그러한 라이브러리를 구현할 필요가 없습니다.

http://gmplib.org/

2

당신은 pstdint.h를 살펴 할 수 있습니다. stdint.h의 이식 가능한 구현이며 C99 컴파일러 지원이 필요하지 않습니다.