본문 바로가기

공부/c언어 기초

C언어: short형 부호 확장 문제 해결 방법

원래 목표는 0xfe05를 출력하는 것이었다.
 
하지만 직접 출력해보니 나오는 결괏값은 0xfffffe05가 나온다...?
 
 

 
 
원인을 찾아보니 short 타입의 범위와 부호 확장 문제 때문인 것을 알았다.
 

📌 문제의 원인

0xFE05는 16비트인 short로 자료형을 저장해 놓고 printf( ) 안에는 %x: 정수형 출력을 사용해서 오류가 발생했다.
 

  • 16비트 short 타입-32768부터 32767까지의 값을 가질 수 있는데, 0xFE05는 음수 범위에 해당하는 값이므로 short 변수에 저장되면 부호 확장이 발생하여 32비트 시스템(int)에서는 0xFFFFFE05로 변환되어 출력된다.

 

📌 해결 방법

short 타입의 음수 문제를 해결하려면, unsigned short로 처리하거나 short와 %hx를 사용해야 된다.
 

 1. unsigned short 사용하기

short 대신 unsigned short를 사용하면 
 

 
출력 결과: 테스트한 결과는 0xfe05이다.
 
 

 2. short 사용하는 대신 %hx 사용하기

일단 이것을 gpt 에게 검색하기 전에는 %hx라는 것이 존재하는지도 몰랐지만, 찾아보니 알게 되었다.
 
%x와 %hx의 차이점 데이터의 크기이다.
 
나는 %x를 사용했기 때문에 자료의 크기가 크게 나온 것 같다.
 
출력할 때 원하는 자료형(int인지 short인지)에 따라 구분해서 사용하면 될 것 같다

%xint (4바이트)정수를 16진수로 출력
%hxshort (2바이트)short 값을 16진수로 출력

 
 

반응형