시프트 연산 값이 다르게 나옵니다.
#include <stdio.h>
void main() {
unsigned char data = 0x2E;
data = data << 3;
printf("%x", data);
}
<< 이것은 2의제곱으로 곱하는 거랑 같다고 했는데
<<3 이면 8을 곱하는 것과 같은데
0x2E를 << 3 했는데 결과는 0X70 이 나오네요...
왜 8을 곱했는데 저값이 나오는지 모르겠습니다
55글자 더 채워주세요.
2개의 답변이 있어요!
안녕하세요.
0x2E * 0x8 = 0x170이 맞지요.
char는 1바이트(8비트 = 16진법 2자리)니까 앞의 1은 Overflow가 되면서 0x70이 되는 겁니다. 오버프로우가 되는 비트는 값을 받을 곳이 없으면 유효하지가 않아집니다.
2바이트로 하면 0x170으로 나옵니다.
감사합니다.
unsigned char data 로 선언을 하셨고
숫자를 0x2E 로 하셨는데요
우선 위 쉬프트 개념을 이해하시려면 2진법으로 고쳐본후 따져보시면
쉽게 이해가 되실겁니다
16진수 : 0x2E
2진수 : 0010 1110
이와 같구요
data = data << 3; 을 통해서 3비트를 이동하셨어요
그래서
2진수 : 0111 0000
16진수 : 0x70
위와 같은 결과로 인해
말씀하신데로 0x70 이 정상적인 출력값입니다
만일 생각하신데로 출력을 하시려면
unsigned char data <== 이 부분이 1바이트 선언인데
이걸 2바이트 선언으로 바꿔주시면 원하시는 결과가 나올것입니다^^