2017-11-07 17 views
0

4 개의 8 비트 값을 하나의 32 비트 값으로 저장하기 위해 32 비트 변수를 사용하고 있습니다.8 비트 MCU에서 32 비트 가변 쉬프트

32_bit_buf[0]= cmd[9]<<16 | cmd[10]<<8| cmd[11] <<0; 

cmd 32 비트 변수는 I 0xFFFFBBCC를 얻고 인쇄 그러나 데이터

cmd [9]=AA 
cmd[10]=BB 
cmd[11]=CC 

부호와 문자 형태이다.

Architecture를 8 비트 AVR XMEGA

Language- C

내가 잘못거야 어디 사람이 알아낼 수 있습니다.

+0

이러한 변수의 정의가 중요합니다. int보다 작은 모든 값은 먼저 int로 승격됩니다. 'int'가 서명되고, 부호 비트를 밀 때 행동은 정의되지 않습니다. 그런 다음 값은 32 비트 버퍼로 부호 확장됩니다. 심지어 * 정의가 중요합니다. –

+0

https://stackoverflow.com/questions/2280663/in-ac-expression-where-unsigned-int-and-signed-int-are-present-which-type-will –

+0

@AnttiHaapala 부호 비트는 * 즉각적인 문제는 여기에 있지만 다음 질문이 될 수 있습니다 ... 내 답변에 추가했습니다. –

답변

5

아키텍처에서 16 비트 int을 사용하므로 16 자리 씩 이동이 정의되지 않습니다. cmd[9]을 더 넓은 유형으로 전송하십시오 (예 : (uint32_t)cmd[9] << 16이 작동해야합니다.

또한 다른 구성 요소에이 캐스트를 적용해야

: 당신이 cmd[10] 8로 장소를 이동하는 경우, 당신은 더 이상에 이르는, int 당신의 피연산자가 자동으로 승진 서명 한 16 비트의 부호 비트에 이동할 수/정의되지 않은 동작.

+0

에서 온 곳입니다. 그 덕분에 .. –

0

8 비트 컨테이너 (부호없는 char)에서 값을 시프트하고 32 비트를 얻으려고하기 때문입니다. 8 비트 값은 int (16 비트)으로 확장되지만 여전히 충분하지 않습니다. 여러 가지 방법으로 문제를 해결할 수 있습니다. 목적지 변수를 누산기로 사용할 수 있습니다.

32_bit_buf[0] = cmd[9]; 
32_bit_buf[0] <<= 8; 
32_bit_buf[0] |= cmd[10]; 
32_bit_buf[0] <<= 8; 
32_bit_buf[0] |= cmd[11]; 
+0

죄송하지만 "8 비트 컨테이너"는 없습니다. 피연산자는 signed int로 승격됩니다. 제안 된 솔루션이 작동하지만 설명이 잘못되었습니다. –