관리 메뉴

KorSA

Error Message: 식에 정수 또는 범위가 지정되지 않은 열거형 형식이 있어야 합니다 본문

Development Experience/C, C++

Error Message: 식에 정수 또는 범위가 지정되지 않은 열거형 형식이 있어야 합니다

Praiv. 2019. 10. 3. 18:06
320x100

(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개만 저장되는 것...

 

그래서 그랬구나..

728x90
728x90
Comments