ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1 << 31
    Programming Language/c,c++ 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
Designed by Tistory.