2012-10-21 2 views
0

나는 모든 짝수 색인 바이트를 int로 복사하고있는 바이트 버퍼에 대한 포인터를 가지고 있습니다. 왜냐하면 (데이터가 버퍼에 저장되는 프로토콜 때문에 홀수 사이클은 읽음을 알고 있기 때문입니다). 지금 내가 이것을 할 때C는 부호 확장을 어떻게 처리합니까?

signed int a; 
... 
//inside a loop 
a = buffer[2*i]; //buffer is unsigned 

그것은 나에게 부호없는 수를 준다. 그러나 내가 이것을 할 때

a = (int8_t)buffer[2*i] 

숫자는 서명 된 형식으로 표시됩니다. 그것은 내가 위와 같은 시나리오에서 특히 c에서 기호 확장을 재고하는 것을 강요합니다. 필자는 서명 한대로 컴파일 할 것이므로 컴파일러는 자동으로 서명 확장을 수행합니다. 아무도 왜 이것이 사실이 아닌지 설명하기 위해 시간을 할애 할 수 있습니까? 방금이 함정에서 1 시간을 보냈다가 나중에 다시 같은 함정에 빠지기를 원하지 않습니다.

+3

좋은 읽기 http://www.cs.umd.edu/class/sum2003/cmsc311/Notes /Data/signExt.html –

+0

C에서 부호 확장이 작동하는 방식을 알고 있지만 부호없는 숫자 (부호 비트가 1)가 있고 더 긴 정수로 캐스팅하여 부호가 확장되는 경우 그 처리 방법 ? 죄송합니다. 질문에서 명확하지 않은 경우. – as3rdaccount

답변

2

buffer은 부호없는 8 비트 정수 배열입니다 (또는 하나의 역할을합니다). 그래서 buffer[2*i]의 값은 0 내지 255 (포함)의 범위이며, 그 범위 내의 모든 값이 너무

a = buffer[2*i]; 

이 값 int이 넓은 형태로 프로모션을 유지 할당 int S로서 표현할 수있다 0으로 채워서 수행합니다.

당신이 할당하기 전에 int8_t 캐스팅, 그냥 서명으로 비트 패턴을 재 해석하여 가장 가능성이 int8_t를 입력하기 위해보다 큰 127 구현 정의 된 방식으로 변환됩니다 버퍼에

a = (int8_t)buffer[2*i] 

값 음수 값이되는 8 비트 정수 (-128에서 -1) 이 값은 int으로 표시 될 수 있으므로 할당시 보존되므로 더 넓은 유형 int에 대한 값 보존 프로모션이 부호 확장을 통해 수행됩니다.

0

int_8에는 8 비트 만 있고, 최상위 비트가 1이면 음수 값 : 1xxxxxxx를 유지합니다. 부호있는 int (32 또는 64 비트)에 이러한 값을 할당하면 물론 음수 값을 얻습니다 . 더 긴 int는 11111111 11111111 11111111 1xxxxxxx처럼 보일 것입니다. 단지 간단한 xor가 트릭을 할 것입니다. 00000000^1001 => 11111001