문제

(char) 0xff의 왼쪽 시프트에서 8 x int로 캐스팅하면 -256 또는 0xffffff00이됩니다. 누군가 왜 이런 일이 일어나야하는지 설명 할 수 있습니까?

#include <stdio.h>
int main (void)
{   
    char c = 0xff;
    printf("%d %x\n", (int)(c<<8),(int)(c<<8));
    return 0;
}

출력입니다

-256 ffffff00
도움이 되었습니까?

해결책

char 서명하거나 서명 할 수 있습니다 - 구현 정의입니다. 이 결과를 본다 char 컴파일러에서 기본적으로 서명합니다.

서명 된 char 0xff의 경우 -1에 해당합니다 (2의 보완이 작동하는 방식). 당신이 그것을 바꾸려고 할 때 그것은 먼저 int 그런 다음 바뀌 었습니다 - 당신은 256까지 효과적으로 곱셈을받습니다.

그래서이 코드입니다.

char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );

다른 팁

내가 문제를 처음 보았을 때, 나의 초기 견해는 char 'c'가 왼쪽으로 8 비트로 이동해야한다는 것이었다.

약간의 연구 결과가 드러납니다 일반적인 외교 변환 - 이것은 많은 수의 산술 유형을 줄이기위한 곳입니다. 전환은 단영의 오페라에 자동으로 적용됩니다! ','- ','~ '및'*'연산자, 그리고 이진의 각 피연산자 '<<'및 '>> 연산자.

따라서 char 'c'는 int로 변환됩니다. 첫 번째, 그런 다음 왼쪽으로 이동하여 답을주었습니다.

당신은 매일 새로운 것을 배웁니다!

시프트 작동이 완료되기 전에 C가 INT로 홍보되고 있습니다. 구현으로 인해 Chars가 기본적으로 서명한다고 가정하면 0xffffffff를 얻은 다음 왼쪽으로 이동하여 결과를 제공합니다.

서명되지 않은 숯으로 C를 만들면 기대하는 것을 얻어야합니다.

숯은 서명 된 숯일뿐입니다. 따라서 char c = 0xff는 -1입니다. Shift -1 x 8 비트를 떠났을 때 -256을 얻습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top