TLDR : 정수 b가 음수이므로 오른쪽으로 시프트하면 최상위 비트 (즉, 1)의 값이 동일하게 유지됩니다. 따라서 b 위치를 24 위치만큼 이동하면 0xFFFFFFFF가됩니다.
긴 설명 :
귀하의 정수는 32 비트 이상 및 부호있는 정수는 2의 보수로 표현되어있는 플랫폼에 가정은 부호있는 정수 변수에 할당 된 0xFFFF0000은 음수이다. int가 32 비트보다 길면 0xFFFF0000은 부호가 먼저 확장되고 여전히 음수가됩니다. 음수 쉬프팅
적합한 표준 (C99/N1256, 섹션 6.5.7.5)에 의해 정의 된 구현 :
>> E1 E2의 결과 E1 E2 오른쪽 시프트 비트 위치이다. [...] E1 에 부호가있는 유형과 음수 값이있는 경우 결과 값은 구현이 정의됩니다.
즉, 특정 컴파일러가 특정 상황에서 일어나는 일을 선택할 수 있지만 컴파일러 설명서에서 그 효과를 알아야합니다.
많은 프로세서에서 두 세트의 시프트 명령어, 즉 논리 시프트와 산술 시프트가 발생하는 경향이 있습니다. 논리 시프트 오른쪽은 비트를 시프트하고 노출 된 비트를 0으로 채 웁니다. 산술 시프트가 오른쪽으로 (2의 보수를 다시 가정하면) 노출 된 비트가 최상위 비트의 동일한 비트 값으로 채워 지므로 시프트를 2로 나눈 값과 일치하는 결과가됩니다 (예 : -4 >> 1 == 0xFFFFFFFC >> 1 == 0xFFFFFFFE == -2)
귀하의 경우에는 컴파일러 구현자가 부호가있는 정수에 적용될 때 산술 시프트를 사용하기 때문에 음수 오른쪽 값은 음수 값을 유지합니다. 0xFFFF0000 비트 패턴의 관점에서 >> 24는 0xFFFFFFFF를 제공합니다.
당신이하고있는 일을 절대적으로 확신하지 않는 한, 내부 표현이 안전함을 비트 집합으로 취급 할 수 있으므로 부호없는 유형에만 비트 연산을 수행하는 것이 가장 좋습니다. 또한이 경우 사용하는 숫자 값에 부호없는 접미사를 추가하여 부호가 없는지 확인해야 할 수도 있습니다.
흥미 음수 우 패드 서명. 나는 당신이 비트 - 시프트 할 때 그 사인이 남아 있다는 사실을 어떻게 놓쳤는 지 궁금하다. –
@ RichardJ.RossIII : 부호가있는 정수에만 해당되므로 어쩌면 눈치 채지 못할 수도 있습니다. 또는 문제가되는 올바른 범위의 정수 (2의 보수 표현 및 음수 값)를 가진 적이 없었을 것입니다. – tinman
@ RichardJ.RossIII : 0'' ~ 0'''의 보수를 바꾸려고 노력했습니다. 더 좋은 방법은'~ 0u >> x'였습니다. – Morpfh