2009-08-05 3 views
18

이것은int가 C로 항상 32 비트입니까?

How to Declare a 32-bit Integer in C

몇몇 사람들은 INT 32 비트 대부분의 플랫폼에서 항상 언급, 다음과 같은 질문에 관련이 있습니다. 이것이 사실이라면 나는 호기심이 많다.

int 크기가 다른 최신 플랫폼을 알고 계십니까? 8 비트 또는 16 비트 아키텍처의 공룡 플랫폼은 무시하십시오.

참고 :다른 질문에서 32 비트 정수를 선언하는 방법을 이미 알고 있습니다. 이것은 다른 크기의 정수를 지원하는 플랫폼 (CPU/OS/컴파일러)을 찾는 조사와 같습니다.

+10

PC 환경이 아닌 최신 8 비트 및 16 비트 프로세서가 있습니다. – Gerhard

답변

39

여러 사람들이 'int'가 32 비트라는 보장은 없지만 특히 비트 조작이 필요한 코드를 작성할 때 특정 크기의 변수를 사용하려면 'Standard 정수 유형 '은 c99 사양에서 요구합니다. 등

int8_t 
uint8_t 
int32_t 
uint32_t 

...

는 그들이 '유'는 부호 양을 원하는 지정 폼 [U] intN_t, 일반적이며, N 비트의 개수

이들에 대한 올바른 typedef는 stdint.h에서 컴파일 할 플랫폼에 사용할 수 있어야합니다.이를 사용하면 다음과 같이 멋진 코드를 작성할 수 있습니다 .-)

+0

+1 간단하고 깨끗한, 그냥 작동;) –

+0

+1, 함께 가자. – nielsj

+5

질문에 대답하지 않고 니스 대답을 물어보십시오. – Christoffer

2

이것은 컴파일러에 따라 크게 달라집니다. 일부는 64 비트 컴퓨터에서 64 비트 컴퓨터로 컴파일하고 일부 컴퓨터에서는 32 비트 컴퓨터로 컴파일합니다. 임베디드 시스템은 매우 작고 특별한 왁스 공입니다. 당신이 할 수있는

가장 좋은 점은 확인 :

printf("%d\n", sizeof(int)); 

sizeof 것을 바이트를 출력합니다. 비트를 얻으려면 sizeof(int)*CHAR_BIT하십시오.

코드는 다양한 종류의 비트 수를 인쇄하려면 :

#include <limits.h> 
#include <stdio.h> 

int main(void) { 
    printf("short is %d bits\n",  CHAR_BIT * sizeof(short) ); 
    printf("int is %d bits\n",  CHAR_BIT * sizeof(int ) ); 
    printf("long is %d bits\n",  CHAR_BIT * sizeof(long) ); 
    printf("long long is %d bits\n", CHAR_BIT * sizeof(long long)); 
    return 0; 
} 
+0

이것은 여러 차원에서 잘못되었습니다. 첫째,'sizeof'는 타입에 대해 작동 할 수 있으므로'randomint '가 필요 없습니다. 두 번째로,'CHAR_BITS'는 8이 될 것이라고 보장하지 않습니다. 몇 가지 사항이 있지만 질문과 관련된 오류입니다. –

+0

바이트에서 항상 8 비트가 아닌, –

+0

@Eric의'CHAR_BIT'. 나는 나의 코멘트에서 그것을 잘못 철자했다. –

12

"항상 입니다가장 플랫폼에서 32 비트"- 그 조각 뭐가 잘못? :-)

C 표준은 변수의 크기를 지정하지 않습니다. 위임 상대 크기입니다 (예 : sizeof(int) >= sizeof(short)). 또한 최소 범위를 요구하지만 다중 인코딩 스키마 (2의 보수, 1의 보수 및 부호/크기)를 허용합니다. 특정 크기의 변수를 원하는 경우

, 당신은 당신이 그런 #ifdef 년대의 사용으로,에 실행중인 플랫폼에 적합한 하나를 사용해야합니다, 뭔가 같은 : 또는

#ifdef LONG_IS_32BITS 
    typedef long int32; 
#else 
    #ifdef INT_IS_32BITS 
     typedef int int32; 
    #else 
     #error No 32-bit data type available 
    #endif 
#endif 

, C99 허용 정확한 폭 정수 타입 intN_tuintN_t을 위해 :


  1. typedef입니다 이름 intN_t은 위스콘신과 부호있는 정수 유형을 지정 dth N, 패딩 없음 비트 및 2의 보수 표현. 따라서 int8_t은 너비가 정확히 8 비트 인 부호있는 정수 을 나타냅니다.
  2. typedef 이름 uintN_t은 너비가 N 인 부호없는 정수 유형을 나타냅니다. 따라서 uint24_t은 너비가 정확히 24 비트 인 부호없는 정수 유형을 나타냅니다.
  3. 이러한 유형은 선택 사항입니다.그러나 구현시 너비가 8, 16, 32 또는 64 비트 인 정수 유형을 제공하는 경우 패딩 비트가없고 의 2의 보수 표현을 갖는 (부호있는 유형의 경우) 해당 유형 정의 이름을 정의해야합니다.
+2

나를 이길 :) C 또는 C++에서 기본 제공 변수의 크기에 의존하는 것은 본질적으로 버그입니다. – kyoryu

+6

C 표준은 최소 범위 (최소 크기를 의미)를 요구합니다. int의 최소 범위는 -32767 ~ +32767이며 최소 long 범위는 -2147483647 ~ +2147483647입니다. – caf

+3

(즉, 32 비트 정수의 범위를 저장할 수있는 변수 만 원한다면 long 또는 unsigned long을 사용하십시오. 사전 처리기 bodginess는 필요하지 않습니다.) – caf

2

아니요. 작은 임베디드 시스템에서는 16 비트 정수를 사용합니다.

5

현재 대부분의 데스크톱 및 서버 플랫폼은 32 비트 정수를 사용하며 심지어 많은 임베디드 플랫폼 (핸드 헬드 ARM 또는 x86)은 32 비트 int을 사용합니다. int으로 가려면 실제로 "Berkeley mote"또는 더 작은 Atmel Atmega 칩을 생각해야합니다. 그러나 그들은 밖에 있습니다.

+0

예, 실제로 대답하는 유일한 대답입니다! 그러나 32 비트를 사용하는 특정 컴파일러/플랫폼 또는 32 비트를 사용하지 않는 플랫폼을 알면 매우 좋을 것입니다. –

1

음, 대부분의 ARM 기반 프로세서는 Thumb 코드를 실행할 수 있습니다. 16 비트 모드입니다. 여기에는 아직 소문난 안드로이드 노트북과 최첨단 스마트 폰이 포함됩니다.

또한 그래프 작성 계산기 중 일부는 8 비트 프로세서를 사용하고 있으며, 상당히 현대적이라고도합니다.

+2

8 비트 정수를 사용하는 C 구현을 수행 할 수 없으므로 해당 계산기가 8 비트 인 경우에도 C 컴파일러가있는 경우 최소한 16 비트를 int로 지정해야합니다. –

+0

아, 맞습니다. – Christoffer

+0

Thumb 코드는 여전히 32 비트 int를 사용합니다. '16 비트 '측면은 인코딩 된 명령어의 크기에 불과합니다. –

1

TI는 C55x DSP가 탑재 된 OMAP 보드를 주로 비디오 디코딩에 사용하고있다. 나는 이것에 대해 제공된 컴파일러가 16 비트 int를 가지고 있다고 믿는다. 공룡은 거의 없지만 (Nokia 770은 2005 년에 출시되었습니다), 32 비트 DSP를 얻을 수는 있습니다.

작성한 대부분의 코드는 DSP에서 실행되지 않을 것이라고 가정 할 수 있습니다. 그러나 아마 모든 것이 아닙니다.

0

비트 수 대신 실제 최대/최소값에도 관심이있는 경우 limits.h에는 알고 싶은 모든 것이 포함되어 있습니다.

관련 문제