dave1011   5년 전

https://www.acmicpc.net/board/...

앞서 틀렸습니다의 원인을 못찾아 질문을 올렸었는데요.

%lld가 아닌 %d로 읽어서 long long 형에 대입하는 바람에 발생하는 문제로 확인되었습니다.

정확히는 문제 상에서 f(x)의 y좌표에 해당하는 값들에 대해서는 반드시 %lld를 사용했어야 했고 k의 경우에는 %d로 넣어도 잘 되는 것으로 확인되었습니다.

혹시 순수하게 %lld가 아닌 %d를 써서 발생했던 문제인지, 아니면 데이터에 %d 밖의 숫자가 있어서 그런건지 알 수 있을까요?

요점은 %lld가 아닌 %d를 쓸 경우 %d의 범위 이내 숫자를 읽더라도( 일반적으로 4(byte), 숫자로 signed 기준 양수인 경우 2^31-1 이하) 이렇게 오류가 날 수 있는건지 궁금합니다.

dave1011   5년 전

아랫부분의 for 문에서 오버플로우가 발생하기 때문인 것으로 확인되었고,

범위 밖으로 boundnum이 넘어갈경우 break를 걸어주면 long long int를 쓰지 않아도 문제가 없는 것으로 확인되었습니다.

또한, %d로 숫자를 받아서 long long에 저장하는 경우, 범위 이내의 숫자를 저장하는데는 문제가 없어보입니다. 다만, 컴파일러가 경고를 주기는 하는 것으로 나타났습니다.

bupjae   5년 전

15번째 줄의 실행 결과는 정의되어 있지 않습니다 (undefined behavior)

지금 당장은 잘 되는 것 처럼 보이더라도 이건 특정 C++ 구현체에서 정말로 우연히 잘 맞아 떨어진 것 뿐이며, 구현체가 달라지면 (컴파일러 버전이 달라지거나, 다른 컴파일러를 쓴다거나...) 언제든지 오류를 일으킬 수 있습니다.

댓글을 작성하려면 로그인해야 합니다.