psj1028   5년 전

이 코드에서 처럼 A[]와 ans 대해서 %d로 입력을 받고 출력을 하니

-1 -5 -6 -1 -9 -10을 input으로 했을 때 -32가 나오고

뭐지 뭐지 하면서 아! 하고 %lld로 바꾸니 -1이 제대로 나왔습니다.

원인이 무엇인가 하고 if(ans < dp[i]) 을 살펴보니 무조건 다 조건에 걸려서 그렇더군요..;

비교에서 문제가 발생한 이유가 무엇인지 궁금합니다.

djm03178   5년 전

채점 환경에서 int는 4바이트고, long long은 8바이트입니다.

scanf는 인수로 넘겨준 주소가 int인지 long long인지 모릅니다. 오로지 서식 문자에 의해서만 판단하는데, %d를 주면 타겟이 int라고 생각하고 4바이트 분량만 덮어쓰게 됩니다.

음수는 최상위 비트가 1인 수입니다. 하지만 8바이트 범위에서 4바이트의 최상위 비트는 그냥 가운데 쯤 있는 비트일 뿐입니다. 그래서 이 수는 좀 큰 양수로 취급됩니다.

djm03178   5년 전

그런데 왜 마지막에 음수가 출력되었는가 하면, 출력할 때 printf 역시 서식 문자에 의해서만 인자의 자료형을 판단하는데, ans를 int로 취급함으로써 상위 4바이트가 잘려나가고 나머지를 봤을 때 이 값은 다시 최상위 비트가 1인 음수이기 때문입니다.

psj1028   5년 전

좋은 설명 감사드립니다! 완전 이해가 잘 됐습니다 ㅎㅎ

그래서 조건문에 계속 들어갔던 거군요

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