개념 공부/C 언어

정수 승격 (다른 타입과의 비교 연산)

배3 2025. 5. 4. 16:49

char와 short, int 형의 연산이 헷갈려 정리하고자 작성했다.


정수 승격 (Integer Promotion)

정수 승격이 왜 필요할까?

CPU의 모든 명령어 처리는 ALU가 담당한다.

** 참고: CPU 구성 요소 ** 

https://baeslee.tistory.com/1

 

CPU vs. MPU vs. MCU

CPU, MPU, MCU, microprocessor, microcontroller, MICOM, SoC, processorCPUCentral Processor UnitALUregister (bank)control logic/unit위 3가지 요소를 갖추면 CPU 라고 칭할 수 있다.- 구성 보드가 여러 개여도 3가지 요소가 있으면 C

baeslee.tistory.com

CPU 동작에 관련한 글은 추후 작성 예정이다... (ALU, register, control unit 관련)

 

ALU는 일반적으로 32 bit 단위이며, 정수가 4Byte 즉, 32bit 이다. (ALU는 정수를 좋아한다..!...?)

그래서 정수 승격이 필요하다.

ALU가 연산하기 위해 32 bit로 맞춰 변환해주는 것이다.

설명은 일반적인 32 bit CPU 기준으로 작성하겠다. (예외는 16 bit)

 

우선 자료형 크기는 다음 표와 같다. ** type = (자료)형 

Type Size
char 1 Byte
short 2 Byte
int 4 Byte

형 변환 (Type Casting)

= type conversion, type coercion, type juggling

char 형

char 형을 int 형으로 변환 시, 우선적으로 signed int 형이 된다.

signed char 형이든, unsigned char 형이든 상관없이 signed int 형으로 변환된다.

즉, 부호가 살아있다.

 

예시) 형 변환 결과

** 참고: 문법 지키지 않고 작성

(signed) char a = 1 (0b 0000 0001) → (signed) int a = 1 (0b 0000 0000 0000 0000 0000 0000 0000 0001) 

(signed) char b = -1 (0b 1111 1111) → (signed) int b = -1 (0b 1111 1111 1111 1111 1111 1111 1111 1111)

unsigned char c = 1 (0b 0000 0001) → signed int c = 1 (0b 0000 0000  0000  0000  0000 0000 0000 0001)

unsigned char d = -1 (0b 1111 1111) → signed int d = 255 (0b 0000 0000 0000 0000 0000 0000 1111 1111)


short 형

char 형과 동일하다.

short 형을 int 형으로 변환 시, 우선적으로 signed int 형이 된다.

signed short 형, unsigned short 형 모두 signed int 형으로 변환된다.


비교 연산

char, unsigned char, short, unsigned short 형

앞서 서술한 타입(char, short, unsigned char, unsigned short)은 모두 signed int 형으로 변환되어 비교 연산된다.

따라서 unsigned 형과 signed 형을 비교하더라도 결국 signed int 형끼리 비교하는 모습이 된다.

 

예시) unsigned short 1과 signed short -1 비교

unsigned short 1 (0x01) → signed int 1 (0x0001)

signed short -1 (0xFF) → signed int -1 (0xFFFF)

비교하면 1 > -1 이므로, 결과는 'unsigned short 1 > signed short -1' 이다.


int, unsigned int 형

그럼 signed int 형과 unsigned int 형의 비교는?

signed int 형 변수의 값에 따라 다르다.

그 값이 unsigned int 형의 범위(0 ~ 2^8-1) 내 이면, signed int 형이 유지되며 비교한다.

결국 해당 범위는 signed int 형 값이 음수가 아닐 때이다. 하지만 범위 밖(음수; -2^7 ~ -1)일 때는, unsigned 형으로 변환된다.

사실 char 형과 short 형 모두 그렇다.

signed 형의 값이 unsigned 형 범위 밖이라면 unsigned 형으로 바뀌지만, 일반적으로 signed int 형은 4 Byte이고 char와 short는 그보다 작은 크기(1 Byte, 2 Byte)이기 때문에 signed int 형으로 되어도 범위를 벗어나지 않았던 것이다.

아까 예외라고 언급했던 16 bit CPU이면, char, short 역시 범위를 벗어날 수 있기에, 예외라고 했던 것이다.

 

unsigned int 10 과 signed int 10을 비교 연산하면 (당연히) 같다.

unsigned int 10 과 signed int -10을 비교 연산하면, signed int -10 (0b 1111 1111 1111 1111 1111 1111 1111 0110) 이 unsigned int 로 변환되어 -10이 아닌 4294967286 값으로서 비교된다. 그래서 결과가 10 < -10 (4294967286)이 되는 것이다.