문제

나는 단지 Printf의 남자 페이지를 찾고 있었고 무언가가 나에게 일어났다. 비교적 간단한 질문에 대답 할 수있는 "언어 변호사"가 있는지 궁금합니다.

따라서 't'수정자는 다음과 같이 정의됩니다

다음 정수 변환은 ptrdiff_t 인수에 해당합니다.

그래서 무엇입니까 추정된 서명되지 않은 정수 변환과 이것을 결합하면 발생 하시겠습니까? 분명히 O, U, X 및 X는 모두 서명되지 않은 값으로 해석되는 반면 D와 I는 서명합니다.

마찬가지로 모든 수정 자 (int/unsigned int, size_t/ ssize_t, 등) ptrdiff_t.

실제로 서명되지 않은 버전의 유형이 서명 된 버전과 동일한 공간을 차지하기 때문에 나쁜 일은 일어나지 않습니다. 따라서 바이트의 권리가 스택에서 튀어 나옵니다.

따라서 실제로 "나쁜"것은 아무것도 발생하지 않습니다.INT_MIN"(그것을 가정합니다 sizeof(int) == sizeof(ptrdiff_t).

printf("%tu %td\n", INT_MIN, INT_MIN);

인쇄물

2147483648 -2147483648

32 비트 시스템에서.

표준에 이것에 대한 의견이 있습니까? 나는 그 대답이 "정의되지 않은 행동"이라고 생각합니다. 그러나 나는 내가 물어볼 것이라고 생각했다;).

도움이 되었습니까?

해결책

여기는 볼게 없다. 당신이 작성한 코드는 합법적입니다.

이유에 대한 몇 가지 사실 만 있습니다.

  • 서명 된 모든 정수 유형에는 서명되지 않은 상대가 있으며 동일한 크기/정렬 요구 사항이 있습니다.
  • ptrdiff_t 표준에 따라 서명 된 정수 유형으로 처방됩니다. 따라서 서명되지 않은 쌍둥이가 있습니다. (실제로 비슷한 논리가 적용됩니다 size_t 또한 - ssize_t C는 아니지만 posix)
  • 그만큼 t 길이 지정자와 함께 작동해야합니다 d, i, o, u, x, X 유형
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top