2009-12-14 3 views
1

MSB 비트가 올바르게 설정되지 않아 예상대로 작동하지 않습니다. metrowerks 컴파일러를 사용하고 있습니다.오른쪽으로 시프트/내가 잘못하고있는 것?

//shifting right 5 characters 
char * buffer; 
buffer=global_buffer; 
for(i=0;i<5;i++) //shift right for 1; 
{ 
    buffer[17-i]=(buffer[17-i]>>1)|(buffer[17-i-1]<<7); 
} 

EDIT (직전 루프) 입력 버퍼 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x2F, 0xA0에, 0xC6,0x9D

은 내가 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x17,0xD0,0xE3,0xCE

루프 에 대한 후 도착
+6

"정확함"을 정의하십시오. 당신의 의견은 무엇입니까? 어떤 결과를 기대합니까? 당신은 어떤 결과물을보고 있습니까? – jason

+0

컴파일러는 "char"를 "signed char"로 구현합니다. 아래의 답 중 하나를 사용하여 이동 된 값이 부호 비트를 손상되지 않게 유지합니다. –

답변

9

"unsigned char * buffer;"를 원할 수도 있습니다. 이것은 부호 비트를 유지하기보다는 0을 상위 비트로 이동시킵니다.

+0

부호가있는 값을 오른쪽으로 시프트해도 항상 부호 비트가 유지되는 것은 아닙니다. Steve Jessops Answer를 참조하십시오. 또한 질문과 함께 토론의 일부를 참조하십시오 : http://stackoverflow.com/questions/1857928/right-shifting-negative-numbers-in-c – Trent

+1

@Trent : 서명 된 값을 오른쪽으로 이동 시키라고 말하지 않았습니다. 나는 서명하지 않은 값을 오른쪽으로 옮겨달라고했다. –

+0

@ 트렌드 : 실제로, 링크가 말한대로 서명 된 교대조차도 일반적으로 예상대로 작동합니다. 나는 그들이하지 않는 아키텍처 (현재 사용중인)에 대해 알지 못한다. –

2

"MSB 비트를 올바르게 설정하지 않았습니다."

C 표준 메시지 :

6.5.7/5 ... E1 서명 된 유형 및 음의 값을 갖는 경우, 생성 된 값이 구현 정의된다.

예를 들어,이 초안을 참조하십시오 : 당신은 MSB의 올바른 값이 무엇인지 확인하기 위해 컴파일러 문서를 확인해야하므로 http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

아마도 char는, 컴파일러에 서명된다. 그리고 다른 모든 것들.