식
(1983 * 214013 + 2531011) % (2^32) 에서
%(모듈러) 연산을 수행하려 하는 중 이 에러가 발생하였다.
모듈러 연산은 정수형에 대해서만 수행 가능한데, 나는 double 형으로 수행하려고 하였기 때문이다.
C++ 에서 2^32 를 구하기위해 pow(2, 32)를 사용하였고, 이 리턴값이 double 형인 것이다.
일반적으로 이 에러가 발생하였다면 간단히 double형 변수가 있는 자리에 int형 변수를 넣으면 된다.
나도 단순히 double 형을 int 형으로 캐스팅하려 했는데..
생각해보니 2^32 라는 int형 범위를 넘어버리는 것이다. 심지어 unsigned int 형 범위도 2^32 - 1 까지다.
살짝 멘붕이 왔다.
% 를 쓰기 위해선 정수형으로 연산해야 하는데, 연산해야 할 값이 정수형 범위를 벗어난다라..
결국 책을 보았고, 거기서 왜 하필 mod (2^32) 를 하였는지 알 수 있었다.
애초에 1983 이라는 값을 담는 변수를 unsigned int 로 생성하였다.
즉,
위의 식을
unsigned int seed = 1983;
unsigned int result = (seed * 214013u + 2531011u);
이렇게 적음으로써 연산 과정에서 발생하는 unsigned int 범위 이상의 값들은 아예 무시해버렸다.
그래서 하필 2^32... 4바이트 int형의 비트 수 32... 비트가 32개...
연산 과정에서 생성되는 값들도 처음 비트 32개만 저장되는 것...
그래서 그랬구나..
'Development Experience > C, C++' 카테고리의 다른 글
HeapAlloc, LocalAlloc, GlobalAlloc 차이 (0) | 2020.11.25 |
---|---|
C++ Heap corruption 원인 (0) | 2020.04.08 |
DLL이 경로에 있음에도 DLLNotFound Exception이 뜬다면.. (0) | 2019.11.12 |
C++ <-> C# 간 마샬링 시 메모리 할당 및 해제 (0) | 2019.10.14 |
C# 과 C++ 간 마샬링시 Heap Corruption 오류에 관하여 (0) | 2019.09.18 |