c++ 사용자 입장에선
1_u32 << 32를 하면 당연히 0이 될 거라고 생각했는데, 다시 한 바퀴 돌아서 1이 되네요?
std에 비트 rotate를 해주는 함수는 따로 rotate_left라고 있는데, shl랑 rotate_left랑 똑같이 동작하니까 당황스럽네요.
저는 오버플로우가 나면 0으로 만들고 싶어요. 그러니까 1_u32 << (32이상인 아무 정수) == 0가 되게 하려면 어떻게 해야 하나요?
c++ 사용자 입장에선
1_u32 << 32를 하면 당연히 0이 될 거라고 생각했는데, 다시 한 바퀴 돌아서 1이 되네요?
std에 비트 rotate를 해주는 함수는 따로 rotate_left라고 있는데, shl랑 rotate_left랑 똑같이 동작하니까 당황스럽네요.
저는 오버플로우가 나면 0으로 만들고 싶어요. 그러니까 1_u32 << (32이상인 아무 정수) == 0가 되게 하려면 어떻게 해야 하나요?
그냥 안 하면 안됨?
오버플로우 난다는 것 자체가 정상적인 상황이 아니라는 거 아님? 러스트도 오버플로우는 UB로 알고 있는데
UB는 아니고 wrapping하거나 panic함
디버그 빌드일땐 패닉 발생하고 릴리즈 빌드일땐 wrapping함 - dc App
n.checked_shl(i).unwrap_or(0)
https://github.com/rust-lang/rfcs/blob/master/text/0560-integer-overflow.md#arithmetic-operations-with-error-conditions
<<, >>할 떄 비트 길이 이상이면 나머지 값으로 바꿔서 쉬프트하네요.
c++ 에서 저거 ub다 게이야