아하
생활

생활꿀팁

깨끗한오징어71
깨끗한오징어71

시프트 연산 값이 다르게 나옵니다.

#include <stdio.h>

void main() {

unsigned char data = 0x2E;

data = data << 3;

printf("%x", data);

}

<< 이것은 2의제곱으로 곱하는 거랑 같다고 했는데

<<3 이면 8을 곱하는 것과 같은데

0x2E를 << 3 했는데 결과는 0X70 이 나오네요...

왜 8을 곱했는데 저값이 나오는지 모르겠습니다

    55글자 더 채워주세요.
    2개의 답변이 있어요!
    • 남다른메추리264
      남다른메추리264

      안녕하세요.

      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바이트 선언으로 바꿔주시면 원하시는 결과가 나올것입니다^^