형변환과 쉬프트 연산자 우선순위

형변환과 쉬프트 연산자 우선순위

enter image description here

형변환과 쉬프트 연산자 우선순위

  • C 언어 코딩 중 아래와 같은 연산을 사용했을 때 예상하지 않는 값이 출력됨
typedef unsigned short u16;
typedef unsigned long u32;

int main()
{
    u32 REG = 0x12340000;
    u32 var;
    
    var = (u16)(REG & 0xffff0000)>>16;
    
    return 0;
}
  • u32는 부호없는 32bit 정수, u16은 부호없는 16bit 정수를 나타냄

  • 위 코드와 같이 연산하였을 때 var0x1234 라는 값을 예상하였으나 0x0 이라는 값이 출력되었음

  • 디버깅 해보니 쉬프트 연산 보다 (u16) 괄호 연산의 우선순위가 더 높아 형변환이 먼저 이루어져서 0x0 값이 출력되는 것이 였음

  • C언어 우선순위를 찾아보니 정상적인 결과라는 것을 알게됨(아래 참조)

enter image description here
<원본링크: https://docs.microsoft.com/ko-kr/cpp/c-language/precedence-and-order-of-evaluation?view=msvc-160 >

  • 우선순위에 괄호는 1번째 우선순위에 있고 쉬프트 연산자는 5번째 우선순위에 있음
  • 원하는 결과를 얻으려면 아래와 같이 코드를 작성하면 됨
typedef unsigned short u16;
typedef unsigned long u32;

int main()
{
    u32 REG = 0x12340000;
    u32 var;
    
    var = (u16)((REG & 0xffff0000)>>16);
    
    return 0;
}
  • 위 코드와 같이 연산하였을 때 쉬프트 연산 후 u16 형변환을 하게 되므로 var0x1234 라는 값을 가지게 됨

여러 연산자를 사용할 때는 반드시 괄호를 사용하도록 하자 !!

댓글 쓰기

0 댓글