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로 저장된거나 하는 것은 아니다.

https://www.felixcloutier.com/x86/movsx:movsxd?utm_source=chatgpt.com

 

위 표가 있는 사이트에서 설명을 읽어보면 소스 피연산자(source operand, 레지스터 또는 메모리에 위치)의 내용을 대상 피연산자(destination operand, 레지스터)로 복사하고 값을16 또는 32 bit로 sign extend한다. 변환된 값의 크기는 피연산자 크기 속성에 따라 달라진다. 이 문서에서 "워드 단위 연산 때문에 MOVSX를 통해 피연산자 크기를 맞춘다" 라는 이야기는 존재하지 않는다. 하지만 기본적으로 이런 연산을 지원한다는게 ALU는 워드 크기 단위로만 연산이 가능하다는 것을 보여주는 증거는 될 것 같다.

 

 

 

 

 

 

참고 자료