int8_t, int_least8_t and int_fast8_t 차이
해당 차이점은 Carl Norum이 인용한 C99 표준의 섹션에 정의되어있다. 하지만 예제를 통해 이해하는 것이 도움이 될 수 있다.
우리가 36-bit system에 대한 C컴파일러를 가지고 있다고 가정해보자. `char` = 9bits, `short`=18bits, `int`=36bits, `long` = 72 bits 라면,
- `int8_t`는 존재하지 않는다. 이는 패딩없이 정확히 8bit를 가진다는 제약을 만족시키지 못하기 때문이다.
- `int_least8_t`는 `char`의 typedef이다. `short`나 `int`가 아니다. 표준은 최소 8bit를 가지면서 가장 작은 타입을 요구하기 때문이다.
- `int_fast8_t`는 무엇이든 될 수 있다. "native" 크기가 빠르다고 고려되면 int의 typedef이 될 가능성이 높다.
- 8bit 이상이며, CPU가 가장 효율적으로 처리할 수 있는 정수형을 의미
공통점은 `int N_t`라고할 때, $type \geq N$이어야 한다. 스택오버 플로우 내용에 따르면, 이는 메모리 접근과 관련이 있을 수 있다.
메모리가 64-bit 워드라고 가정하면, 8-, 16-, 32-bit의 값이라면 프로세스가 메모리를 읽고 원하는 비트를 수정한 다음 64비트 값을 써야할 수 있지만, 64비트의 값은 한 번의 접근으로 write될 수 있다.
- 이는 cpu가 내부적으로 그렇게 처리하는거지, 메모리에 사실 값이 64-bit로 저장된거나 하는 것은 아니다.

위 표가 있는 사이트에서 설명을 읽어보면 소스 피연산자(source operand, 레지스터 또는 메모리에 위치)의 내용을 대상 피연산자(destination operand, 레지스터)로 복사하고 값을16 또는 32 bit로 sign extend한다. 변환된 값의 크기는 피연산자 크기 속성에 따라 달라진다. 이 문서에서 "워드 단위 연산 때문에 MOVSX를 통해 피연산자 크기를 맞춘다" 라는 이야기는 존재하지 않는다. 하지만 기본적으로 이런 연산을 지원한다는게 ALU는 워드 크기 단위로만 연산이 가능하다는 것을 보여주는 증거는 될 것 같다.
참고 자료
- https://stackoverflow.com/questions/5254051/the-difference-of-int8-t-int-least8-t-and-int-fast8-t
- https://www.felixcloutier.com/x86/movsx:movsxd
- https://cse.unl.edu/~goddard/Courses/CSCE351/IntelArchitecture/IntelDataType.pdf
'C,C++' 카테고리의 다른 글
| [C++] 데이터 타입의 크기 지정 방식과 ABI (0) | 2025.09.24 |
|---|---|
| [C++] std::array (0) | 2025.05.03 |
| [C++] Data Types, Type Modifier (0) | 2025.05.03 |
| [C++] 부동소수점의 암시적 변환(Implicit conversions)과 Usual arithmetic conversions (0) | 2025.02.24 |
| [C++] Bitwise not 연산 (0) | 2025.02.11 |