UNIT 24 비트연산자 오류 질문
, 야매 콩님이 작성UNIT 24 p.291에서 비트연산자 오류 질문입니다!
int main()
{
char sol = -125; // 1000 0011
printf("%d\n", sol >> 3); // 1111 0000 -> -128+64+32+16 = -16 맞음!!
printf("%d\n", sol << 1); // 0000 0110 예상함. (6)
return 0;
}
근데 여기서 제가 0000 0110 (즉, 6)으로 예상한 것은 엉뚱하게 -250이 나와
버렸습니다. (그냥 2를 곱해버린 것 같습니다.) char 자료형 같은 경우 용량상 -250을 못 담을 뿐더러, 시프트 연산의 원리와도 위배되는 것 같아서 질문드립니다.
왜 이런 결과가 나온건가요..? 아무리 고민해도 모르겠어서 도움 요청합니다 ㅠㅠ
Re: UNIT 24 비트연산자 오류 질문
, 도장_ 관리자님이 작성결괏값이 이상한 것은 printf에 서식 지정자가 틀려서 입니다.
%d는 정수형에 사용하는데, char 형식을 넣으면 암묵적으로 int 타입으로 변환되어 출력됩니다.
char 형식을 올바르게 출력하려면 %c로 출력해야 합니다. 문자는 문자로 출력되겠지요.
1000 0011 << 1을 하면
0000 0110이 됩니다.
서식 지정자를 %d로 지정했으니 암묵적으로 int로 변환됩니다.
따라서 int의 비트 패턴은
1111 11111111 11111111 1111 0000 0110
이고, 이 값은 -250입니다.
따라서 작성한 코드로는 -250으로 출력되는 게 맞습니다.
%c로 출력하면 해당 값은 제어문자라서 제어 문자가 찍히게 됩니다.