[완료]쉬프트 연산 질문 드립니다.
글쓴이: Fe.head / 작성시간: 수, 2007/10/17 - 8:01오후
예상 했던 결과 값이 안나오고 이상한 값이 나오는데요.
이거 왜 그럴까요?
// n.cpp #include <stdio.h> typedef unsigned long DWORD; int main() { int sht = 32; DWORD x = DWORD(-1) >> sht; printf( "%#x\n", x ); return 0; }
결과값
0xffffffff
제가 예상하는 값은 0 인데요.
요상하게 0xffff ffff 가 들어가 있네요.
혹시나 해서 어셈블리 코드를 봐보니.
shr eax,cl
이렇게 되어있어서 확실히 산술 쉬프트 연산이 아닌 일반 쉬프트 연산인데 말입니다.
어셈블리 코드.
DWORD x = DWORD(-1) >> sht; 00411A81 or eax,0FFFFFFFFh 00411A84 mov ecx,dword ptr [sht] 00411A87 shr eax,cl 00411A89 mov dword ptr [x],eax
0xffff ffff >> 32 가 왜 0xffff ffff 인지 아리송 합니다.
Forums:
진짜 이상하네요.
진짜 이상하네요. ^^
랑 뭐가 다를까요?
이넘은 예상한 대로 나옵니다.
단지 쉬프트를 한번 더했을 뿐인데...
좌쉬프트든
좌쉬프트든 우쉬프트든 n 비트인 경우 n-1 까지만 유효하고 초과되면 undefined 일 겁니다. 다음과 같은 경우도 0 이 되어야 할 것 같지만, 이건 undefined 입니다.
그래서, 32 비트면 0 ~ 31 비트 쉬프트까지 (총 32가지수) 만 유효합니다.
Orion Project : http://orionids.org
그렇군요.
그렇군요. 감사합니다.^^
좋은 하루 되세요^^
-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐?
그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
음... 제 답변에 일부
음... 제 답변에 일부 오류가 있습니다. 다음 사이트에 좀 더 정확히 정의되어 있네요.
http://msdn2.microsoft.com/en-us/library/f96c63ed(vs.80).aspx
'프로모션된 정수의 비트수보다 크거나 같을 때' 이므로, 다음과 같은 경우는 0이 나옵니다.
하지만, 위 경우도 unsigned (unsigned char 가 프로모션된 정수) 가 32 비트인경우, 32비트 또는 그 이상 우쉬프트하면 undefined 입니다.
Orion Project : http://orionids.org
Intel IA-32 Architectures Software Developer's Manual을 찾아보니...
SHR, SAR, SHL, SAL 명령의 shift count 값이 32비트 모드의 경우에는 5 bit만 mask 된다고 되어 있군요. 따라서 32비트 모드일 때는 shift count 값에 무조건 AND 31 연산을 한 것과 같은 결과가 나오게 되는군요.
답글을 달아
답글을 달아 주신분들 감사합니다.
이거 수업시간에 들은기억이 가물가물하게 기억나는군요.
근데 오래되어서 까먹고 있었네요^^
5bit 면
11111 최대 31 이군요.
정말로 33으로 하니까 0x7fff ffff 가 나오는군요.
감사합니다.
-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐?
그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
댓글 달기