Bit shifting 질문
글쓴이: yeilho / 작성시간: 목, 2010/02/11 - 3:25오전
64비트로 포팅하는 문서를 보는데 예제가 있어서 따라 해보았더니 다른 결과가 나오네요...
#include <stdio.h> #include <stdlib.h> #include <stddef.h> ptrdiff_t SetBitN(ptrdiff_t value, unsigned bitNum) { ptrdiff_t mask = 1 << bitNum; return value | mask; } int main() { ptrdiff_t num = SetBitN(0, 32); printf("num: %lld\n", num); }
문서에는 '0' 이 나온다고 했는데 정작 돌려보니 '1' 이 나오네요. 비트가 circular된것 같은데 왜 그런지 잘 모르겠네요.
아시는 분 조언 부탁드립니다.
어찌되었든 문서가 좋습니다.
Forums:
C 표준 6.5.7.3에는
C 표준 6.5.7.3에는 다음과 같은 말이 있습니다.
많은 환경에서 ptrdiff_t의 크기는 32비트이므로, 1 << 32라는 연산 자체가 정의되지 않은 행동을 보입니다. 다양한 경우를 테스트해 보시면 실제로 비트가 순환되는 것인지 확인하실 수 있을 거라 생각합니다.
> What is the difference between software and hard water?
} Bugs drown in hard water, but live forever in software.
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
64비트 환경에서는
64비트 환경에서는 포인터가 64비트이기 때문에 ptrdiff_t도 64비트입니다. (왜 그럴까요?) 물론 링크된 글에서도 언급되었듯 정수 리터럴 1의 타입은 int이지 ptrdiff_t가 아닙니다.
그러게 말이죠.
그러게 말이죠. 링크된 원문을 대충 읽다가 { ptrdiff_t | 32 | 64 } 행을 보고 심하게 착각을 했나 봅니다.
이거 참
double x = 2 / 3;
스러운 실수군요.> What is the difference between software and hard water?
} Bugs drown in hard water, but live forever in software.
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
x86/x86-64 환경에서 x가
x86/x86-64 환경에서 x가 32비트일 경우 컴파일러 구현을 간편하게 하기 위해 (x << n)은 (x << (n%32))와 같은 동작을 하는 경우가 많습니다. 따라서 주어진 코드는 (x << 0), 즉 x와 동일해집니다. 물론 앞 답글에서 언급되었듯 언제고 달라질 수 있으므로 이 동작에 의존하지 않는 게 좋습니다.
댓글 달기