문제
A = 0xff로 서명되지 않은 짧은 int를 초기화합니다 (모든 비트가 설정 됨). 그런 다음 B를 A >> 7에 할당하여 (0000 0001) 산출해야합니다. 그러나 이상한 점은 c를 << 7에 할당 할 때 (1000 0000)과 같지 않다는 것입니다. 0x80 (1000 0000)과 C를 출력하여 이것을 테스트했지만 동일하지 않습니다.
다음은 몇 가지 코드입니다.
unsigned short int a = 0xff;
unsigned short int b = a>>7;
unsigned short int c = a<<7; // c should == 0x80
문제가 무엇인지 잘 모르겠습니다. 모든 도움이 감사합니다. 감사.
PS "출력"에 의해 10 진수 및 16 진 형태의 출력 0x80 및 C를 의미합니다.
해결책
짧은 INT에는 8 비트가 아닌 16 개가 있습니다.
따라서 0xff << 7에서 결과적으로 "0111 1111 1000 0000"을 얻을 수 있습니다.
다른 팁
비트 유형을 추측하지 마십시오 <stdint.h>
짧은 int "대개" 16 비트가 있습니다. 사실, 나는 그것을 확신합니다 언제나 화성 컴퓨터를 제외하고는 16 개가 있지만 표준 약속은 아닙니다.
특정 수의 비트를 가진 유형을 선언하려면 순응 기술이 다음과 같습니다.
#include <stdint.h>
int8_t a;
uint8_t b;
int16_t x;
uint16_t y;
이렇게하는 것은 비트 표현에 대한 당신의 불완전한 권리 추측을 피했을 것입니다. short
. 어떤 이유로, Microsoft는 C99 표준에 이르기까지 긴 방법입니다. <stdint.h>
. 다행스럽게도, 프로젝트는 VC ++ stdint 버전을 유지합니다.
나는 당신이 0x7f80을 얻을 것으로 기대합니다. 나는 당신이 쓰려는 의미가 다음과 같습니다.
unsigned short int c =
b
<<7; // c should == 0x80
불행히도, VC ++ (C 컴파일러)에는 C99를 완전히 지원하지 않기 때문에 inttypes.h가 없습니다. 타사 헤더 (예 : Paul Hsieh 's stdint.h)를 사용해야합니다.
그 결과를 얻으려면 그 부분을 잘라낼 수 있습니다. a << 7
비트 와이어를 사용하여 8 번째 레스트에 유의 한 비트보다 :
unsigned short int c = (a << 7) & 0xff;