2017-01-12 11 views
1

나는 C의 stdint.h 개념에 대해 어느 정도 익숙하다. 정수의 크기를 명시하면 헤더 파일은 #define 정수를 해당 컴퓨터의 적절한 정수로 바꿀 것이다. 예를 들어, 내 컴퓨터에 16 비트 부호없는 정수가있는 경우 uint32_tlong unsigned int으로 바뀝니다.머신이 C에서 표준 정수 데이터 유형을 지원하는지 어떻게 판단 할 수 있습니까?

그러나 컴퓨터가 32 비트 정수까지만 지원한다고 가정 해 보겠습니다. int64_t을 사용하면 어떻게 될까요? 이 정수 크기가 기본적으로 지원되지 않는 경우 문제를 해결할 수있는 대체가 없으므로 어떻게 해결됩니까?

컴파일러가 오류를 처리하고 해결할 수 없다는 오류가 표시됩니까? 또는 64 비트 데이터 유형을 보유하기 위해 두 개의 32 비트 할당을 사용하려고합니까?

+1

수치 연산 보조 프로세서가없는 8 비트 CPU 용 C 컴파일러 (레지스터는 8 비트 만 해당)가 있습니다. 그리고 그들은 long과 float 타입을 지원합니다. 상상할 수 있니? – i486

답변

5

특정 stdint 유형이 지원되지 않으면 코드가 컴파일되지 않습니다. 그들은 다음과 같이 지원되는 경우 확인할 수 있습니다 : 당신의 컴파일러가 타입을 지원하지만 CPU하지 않는

#include <stdint.h> 

#ifndef UINT64_MAX 
#error uint64_t not supported 
#endif 

경우, 일부 컴파일러 라이브러리 코드가 자동으로 더 큰 유형을 모방하기 위해 호출받을 것을 의미합니다.

예를 들어, 8 비트 마이크로 컨트롤러에서 uint32_t을 사용하는 경우 컴파일러가이를 지원하는 경향이 있지만 유형이 소프트웨어를 통해 에뮬레이트되기 때문에 결과 머신 코드는 커지고 느려질 것입니다.

+0

호기심,'#ifndef UINT64_MAX'는 확실히 좋지만 어떤 사양으로 다른 코드가'UINT64_MAX'를 정의하는 것을 막을 수 있습니다. – chux

+0

UINT64_MAX는 stdint.h에 의해 정의되었거나 limits.h입니까? – immibis

+0

@immibis stdint.h – Lundin

2

컴퓨터 (프로세서)는 정수 유형의 상위 비트 폭을 제한하지 않습니다. 컴파일러는 제한을 부과합니다. 하드웨어는 큰 정수 유형을 처리하는 복잡성과 효율성에 영향을줍니다. 1-bit platform조차도 충분한 시간과 메모리가 주어진다면 64 비트 수학을 할 수 있습니다.

호환 C 컴파일러 (C99 이후)는 최소 64 비트까지의 정수 너비를 지원합니다.

예, 32 비트 컴퓨터는 일반적으로 한 쌍의 32 비트 내부 개체를 사용하여 64 비트 작업을 처리합니다.


명확해야. C99 컴파일러는 long long을 구현하기 위해 최소 비트 수를 64 비트로 처리해야합니다. 플랫폼은 uint64_t, 64 비트 폭, 패딩 없음, 2의 보수 유형을 구현하거나 구현할 수 있습니다. 이것은 매우 일반적으로 구현됩니다.

unsigned long long ull; // must exist 

#include <stdint.h> 
uint_least64_t uleast64; // must exist 

uint64_t u64; // may exist 
+0

호환되는 컴파일러는 어떤 이유로 기계에서 처리 할 수없는 경우 최대 64 비트를 지원할 필요가 없습니다. 7.20.1.1 "이러한 유형은 선택 사항이지만, 구현시 너비가 8, 16, 32 또는 64 비트 인 인 정수 유형을 제공하고 패딩 비트가없고 부호가있는 유형의 경우 2의 보수 표현이있는 정수 유형을 제공하는 경우 해당 typedef 이름을 정의해야한다. " 예를 들어, 많은 8 비트 MCU 컴파일러가 uint64_t를 지원하지 않습니다. – Lundin

+0

나는 프로세서가 지시를 깨뜨림으로써 어떤 크기의 정수 연산을 할 수 있다는 것을 이해하지만, 나는 단지 메모리로부터의 읽기/쓰기에 관심이 있다고 가정 해 봅시다. 메모리에서 int64_t에 대한 포인터를 선언하려고 시도하고 해당 포인터의 참조를 취소하기로 결정했다면, 역 참조를 할 수 있습니까? 아니면 첫 번째 32 비트 정수를 역 참조 할 것인가? – Izzo

+1

@Teague 컴파일러가'int64_t'를 지원하면 예상대로 작동 할 것입니다. 한 번에 32 비트의 데이터를 읽고 endianess에 따라 결과를 저장합니다. 그러나 읽기는 느리고 결코 원자가 될 수 없습니다. – Lundin

1

특정 C 구현의 stdint.h (매크로가 아닌 typedef)으로 선언 된 정확한 너비 유형은 모두 선택 사항입니다. 구현시 필요한 특성을 가진 데이터 유형을 실제로 제공하는 경우에만 구현을 선언해야합니다.

특정 예에서, 해당 C 구현이 패딩 비트가없는 64 비트 2의 보수 유형을 제공하지 않는 경우 해당 stdint.hint64_t 유형을 선언하지 않습니다. 그런 다음 직접 선언하지 않고 해당 형식을 사용하면 컴파일러에서 코드를 거부합니다.

stdint.h에서 제공되는 일부 유형의 다른 항목이 필요합니다. 준수하는 구현은 분명히 그들을 제공 할 것입니다. 선택 항목의 경우 해당 매크로가 해당 매크로에 정의되어 있는지 테스트하여 컴파일러에서 매크로를 제공하는지 테스트 할 수 있습니다 (예 : INT64_MAX).