아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
깨끗한오징어71
깨끗한오징어7119.05.24

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

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