limdef 2023. 3. 28. 20:13

1 << 31 을 쓸 때는 조심해야한다.


INT_MAX는 2147483647 이고 2^31 - 1 이다.

이 값을 shfit 연산으로 구하고 싶으면 어떻게 해야 할까?

 

(1<<31) - 1 이 2147483647 이 될까?

아니다.

 

먼저 int형은 32비트, 4바이트를 사용한다.

 

1 << 31은 

1000 0000 0000 0000 0000 0000 0000 0000  이 되고,

부호 비트가 1이 되어 값이 -2147483648 이 된다. (2의 보수)

 

( -1 이 1111 1111 1111 1111 1111 1111 1111 1111 이고,

2147483647은 0111 1111 1111 1111 1111 1111 1111 1111 이다.

 

-2147483648 + 2147483647 은 

   1000 0000 0000 0000 0000 0000 0000 0000

+ 0111 1111 1111 1111 1111 1111 1111 1111  

-------------------------------------------------

1111 1111 1111 1111 1111 1111 1111 1111 이 되어 -1 이 됨.)

 

 

int 범위가 -2,147,483,648~ 2,147,483,647 이므로 (1<<31)-1은 -2,147,483,649 가 되어 overflow 발생

그래서 (1<<31)을 쓸 때는 주의해야한다. 

 

(unsigned int는 부호를 사용하지 않으므로 0~4,294,967,294 의 범위를 가진다.)

	
int main() {    
    int a = 1;
    a <<= 31;
    unsigned int b = 1;
    b <<= 31;
    
    cout << (1<<31) -1<< "\n";
    cout << a << "\n";
    cout << b << "\n";
    
    return 0;
 }
 
 
 
 /// 결과 ///
 
-2147483648
-2147483648
2147483648