Programming Language/c,c++
1 << 31
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