아래 소스코드는 1 2 3 4 5 6으로 이루어진 배열을 6 5 4 3 2 1 과 같이 역순으로 바꾸어 출력하기 위한 코드입니다. 이때
temp = *(back - (5 - n));
arr[n] = *(front + (5 - n));
위 부분에서 산술 오버플로 경고문이 발생합니다. 경고문 내용은 다음과 같습니다.
"4 바이트 값에 '-'연산자를 사용한 다음 결과를 8 바이트 값으로 캐스팅합니다. 오버플로 (io.2)를 피하기 위해 연산자 '-'를 호출하기 전에 값을 더 넓은 유형으로 캐스팅합니다."
back은 포인터 변수로서 주소값이 저장되어있고 8byte입니다. n은 4byte입니다. 8byte값에서 4byte값을 빼는것이 왜 문제가 되는지 잘 모르겠습니다.똑같은 4byte값인 상수를 단독으로 뺴는건 전혀 문제가 되지 않는데 말입니다. [ex. temp = *(back - 5 ); 은 문제가 되지 않음.] 변수 n의 자료형을 long long 으로 바꾸면 경고문이 발생하지 않는데 도저히 이유를 명확히 모르겠습니다. 이러한 경고문이 왜 발생하는 건지 이유를 알려주시면 감사하겠습니다.
dlwocjf2882 2년 전
아래 소스코드는 1 2 3 4 5 6으로 이루어진 배열을 6 5 4 3 2 1 과 같이 역순으로 바꾸어 출력하기 위한 코드입니다.
이때
temp = *(back - (5 - n));
arr[n] = *(front + (5 - n));
위 부분에서 산술 오버플로 경고문이 발생합니다.
경고문 내용은 다음과 같습니다.
"4 바이트 값에 '-'연산자를 사용한 다음 결과를 8 바이트 값으로 캐스팅합니다. 오버플로 (io.2)를 피하기 위해 연산자 '-'를 호출하기 전에 값을 더 넓은 유형으로 캐스팅합니다."
back은 포인터 변수로서 주소값이 저장되어있고 8byte입니다. n은 4byte입니다. 8byte값에서 4byte값을 빼는것이 왜 문제가 되는지 잘 모르겠습니다.똑같은 4byte값인 상수를 단독으로 뺴는건 전혀 문제가 되지 않는데 말입니다. [ex. temp = *(back - 5 ); 은 문제가 되지 않음.]
변수 n의 자료형을 long long 으로 바꾸면 경고문이 발생하지 않는데 도저히 이유를 명확히 모르겠습니다.
이러한 경고문이 왜 발생하는 건지 이유를 알려주시면 감사하겠습니다.