문제

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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top