형변환과 쉬프트 연산자 우선순위
- 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 정수를 나타냄
-
위 코드와 같이 연산하였을 때 var는 0x1234 라는 값을 예상하였으나 0x0 이라는 값이 출력되었음
-
디버깅 해보니 쉬프트 연산 보다 (u16) 괄호 연산의 우선순위가 더 높아 형변환이 먼저 이루어져서 0x0 값이 출력되는 것이 였음
-
C언어 우선순위를 찾아보니 정상적인 결과라는 것을 알게됨(아래 참조)
<원본링크: 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 형변환을 하게 되므로 var는 0x1234 라는 값을 가지게 됨
여러 연산자를 사용할 때는 반드시 괄호를 사용하도록 하자 !!
0 댓글