programing

printf 형식 지정(%d 대 %u)

javamemo 2023. 10. 22. 19:22
반응형

printf 형식 지정(%d 대 %u)

의 차이점은?%d그리고.%u포인터 주소를 인쇄할 때?

예를 들어,

int a = 5;
// check the memory address
printf("memory address = %d\n", &a); // prints "memory address = -12"
printf("memory address = %u\n", &a); // prints "memory address = 65456"

포맷 이스케이프 목록은 이 페이지에서 찾을 수 있습니다.

%d는 부호가 있는 정수인 반면%u는 부호가 없는 정수입니다.포인터(숫자로 처리될 경우)는 일반적으로 음이 아닙니다.

포인터를 표시하려면%p형식 지정자.

%u는 부호 없는 정수를 인쇄합니다.

%d은(는) 부호가 있는 정수를 인쇄합니다.

포인터 주소를 가져오려면 %p를 사용합니다.

다른 형식 지정 탈출 목록:

포맷 이스케이프의 전체 목록은 다음과 같습니다.는 이 페이지에서 스크린샷을 제공하고 있습니다.

enter image description here

내가 당신의 질문을 정확하게 이해했다면 당신은%p포인터가 사용 중인 주소를 표시하려면 다음과 같이 하십시오.

int main() {
    int a = 5;
    int *p = &a;
    printf("%d, %u, %p", p, p, p);

    return 0;
}

는 다음과 같은 것을 출력합니다.

-1083791044, 3211176252, 0xbf66a93c

%u는 부호 없는 정수에 사용됩니다.부호가 있는 정수 주소 연산자 %d에서 지정한 메모리 주소는 -12이므로, 이 값을 부호가 없는 정수로 얻기 위해 컴파일러는 이 주소의 부호가 없는 정수 값을 반환합니다.

차이점은 간단합니다. 컴파일할 때 다른 경고 메시지가 표시됩니다.

1156942.c:7:31: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("memory address = %d\n", &a); // prints "memory add=-12"
                               ^
1156942.c:8:31: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("memory address = %u\n", &a); // prints "memory add=65456"
                               ^

만약 당신이 당신의 포인터를 a로 넘기게 됩니다.void*사용.%p변환 지정자로 다음과 같은 오류 메시지가 표시되지 않습니다.

#include <stdio.h>

int main()
{
    int a = 5;
    // check the memory address
    printf("memory address = %d\n", &a); /* wrong */
    printf("memory address = %u\n", &a); /* wrong */
    printf("memory address = %p\n", (void*)&a); /* right */
}

형식 지정자 %u는 서명되지 않은 정수를 인쇄하는 데 사용되는 반면 %d은 서명된 정수에 사용됩니다.

언급URL : https://stackoverflow.com/questions/1156942/printf-formatting-d-versus-u

반응형