2013-04-20 2 views
2

인 경우 어떻게됩니까? Visual Studio에서 C 코드 다음에 컴파일하면 결과는 4입니다.정수보다 비트 단위로 시프트 한 비트가

void main() { int c = 1; c = c<<34;} 

Visual Studio를 분해 창에서 본 어셈블리 코드는

어셈블리에서
shl eax,22h 

, 그 정수가 여기에 4 바이트이기 때문에 우리가 결과에서, (34)를 이동하는 것을 쉽게 볼 수 이 작업을 2로 시프트 할 때 모듈로 작업을 수행하는 것이 명백합니다.

이 동작이 플랫폼간에 표준화되었거나 플랫폼에 따라 다르면 궁금합니다.

+0

메인을'void main() {...} '이라고 선언하면 어떻게 될까요? – wildplasser

+0

어떤 아키텍처에서 프로그램을 실행하고 있습니까? i386? –

+0

은 x86-64이지만 내 창은 32 비트입니다. –

답변

5

정의되지 않은 동작이 발생합니다. 이것은 언어 표준에 의해 표준화되었습니다 (1999 년 C 표준의 6.5.7 Bitwise shift operators 참조). 그러나 UB의 관찰 가능한 효과는 표준화되지 않았으며 다양 할 수 있습니다.

shl eax, 22h의 경우 시프트 수는 CPU에 의해 5 비트로 잘 리므로 (설명서 참조)이 명령어는 실제로 shl eax, 2으로 동작합니다.

+0

그것은 절삭에 대한 말은 어디 있니? http://download.intel.com/products/processor/manual/325462.pdf –

+1

@LefterisE 바로 거기에, Vol. 2B', 섹션'SAL/SAR/SHL/SHR-Shift' :'카운트 피연산자는 즉시 값 또는 CL 레지스터가 될 수 있습니다. 카운트는 5 비트 (또는 64 비트 모드에서 REX.W가 사용되는 경우 6 비트)로 마스킹됩니다. 카운트 범위는 0에서 31로 제한됩니다 (64 비트 모드와 REX.W가 사용되는 경우 63 개). " –

+0

나는 당신이 당신의 대답을 회상하도록 말한 것을 확인하고 싶었습니다. –

2

this article on MSDN에 따르면

를 시프트 식의 오른쪽 피연산자가 부의 경우 또는 결과는 정의되지 오른쪽 피연산자는 (프로모션) 왼쪽 피연산자의 비트 수보다 크거나 같으면 . 오른쪽 피연산자가 제로 (0)이면 시프트 연산이 수행되지 않습니다.