-
1 << 31Programming 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
'Programming Language > c,c++' 카테고리의 다른 글
구조체(struct), 공용체(union), 열거체(enum) 차이 (0) 2020.10.26