[c] 16 진의 printf () 형식화

이것은 중요한 질문보다 호기심 많은 쿼리이지만 16 진수를 선행 0으로 숫자로 인쇄 할 때 왜 %#08X다음과 같은 결과가 표시되지 0x%08X않습니까?

전자를 사용하려고하면 08서식 플래그가 제거되고 그냥 작동하지 않습니다 8.

다시 나는 단지 궁금했다.



답변

#부분은 0x출력 문자열 에서을 제공 합니다. 0x에 나열된하여 “8”자에 대한 계산 08부분. 동일하게하려면 10자를 요청해야합니다.

int i = 7;

printf("%#010x\n", i);  // gives 0x00000007
printf("0x%08x\n", i);  // gives 0x00000007
printf("%#08x\n", i);   // gives 0x000007

의 경우도 변경하면 x출력 된 문자 의 대소 문자에 영향을줍니다.

printf("%04x", 4779); // gives 12ab
printf("%04X", 4779); // gives 12AB


답변

“0x”는 8 자 카운트로 계산됩니다. 당신은 필요합니다 "%#010x".

참고 #않습니다 하지 0으로 0X를 추가는 – 결과가있을 것입니다 0000000000– 당신은 아마 실제로 단지 사용해야합니다 그래서 "0x%08x"어쨌든.


답변

%#08X변환과 값을 선행해야 0X; 그것은 표준에 의해 요구됩니다. 표준 에 접두어가 길이의 일부로 계산 된다는 점을 제외하고 사양 #08일부 동작을 변경해야 한다는 증거는 없습니다. 0X따라서 사용하고 싶을 수도 있습니다 %#010X. 0x1234CDEF그런 다음 0x%08X원하는 결과를 얻기 위해 사용해야 합니다. 사용할 수 있으며 %#.8X앞에 0을 삽입해야합니다.

다음 코드에서 변형을 시도하십시오.

#include <stdio.h>

int main(void)
{
    int j = 0;
    printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j);
    for (int i = 0; i < 8; i++)
    {
        j = (j << 4) | (i + 6);
        printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j);
    }
    return(0);
}

RHEL 5 시스템 및 Mac OS X (10.7.5)에서 출력은 다음과 같습니다.

0x00000000 = 00000000 = 00000000 = 0000000000
0x00000006 = 0X000006 = 0X00000006 = 0x00000006
0x00000067 = 0X000067 = 0X00000067 = 0x00000067
0x00000678 = 0X000678 = 0X00000678 = 0x00000678
0x00006789 = 0X006789 = 0X00006789 = 0x00006789
0x0006789A = 0X06789A = 0X0006789A = 0x0006789a
0x006789AB = 0X6789AB = 0X006789AB = 0x006789ab
0x06789ABC = 0X6789ABC = 0X06789ABC = 0x06789abc
0x6789ABCD = 0X6789ABCD = 0X6789ABCD = 0x6789abcd

나는 0의 치료에 약간 놀랐습니다. 0X접두사가 생략 된 이유는 확실하지 않지만 별도의 두 시스템을 사용하면 표준이어야합니다. #옵션에 대한 편견을 확인합니다 .


0의 처리는 표준에 따릅니다.

ISO / IEC 9899 : 2011 §7.21.6.1 기능fprintf

¶6 플래그 문자와 그 의미는 다음과 같습니다.

#결과는 “대체 형식”으로 변환됩니다. … x(또는 X) 변환의 경우 0이 아닌 결과에는 접두사 가 0x(또는 0X) 있습니다. …

(공포도 추가됨)


를 사용 %#X하면 16 진수 및 0X접두어로 대문자 가 사용 됩니다 . 를 사용 %#x하면 16 진수 및 0x접두사로 소문자가 사용됩니다 . 0x접두사와 대문자 를 선호하는 경우 0x별도로 코딩해야합니다 0x%X. 물론 필요에 따라 다른 형식 수정자를 추가 할 수 있습니다.

주소를 인쇄하려면 <inttypes.h>헤더와 uintptr_t유형 및 PRIXPTR형식 매크로를 사용하십시오.

#include <inttypes.h>
#include <stdio.h>

int main(void)
{
    void *address = &address;  // &address has type void ** but it converts to void *
    printf("Address 0x%.12" PRIXPTR "\n", (uintptr_t)address);
    return 0;
}

출력 예 :

Address 0x7FFEE5B29428

길이에 따라 독을 선택하십시오. macOS를 실행하는 Mac의 주소에는 12의 정밀도가 적합합니다. .최소 정밀도 (숫자)를 지정 하기 위해 와 결합하여 주소를 안정적으로 형식화합니다. 정밀도를 16으로 설정하면 Mac에서 경험할 때 항상 4 자리가 항상 0이지만 휴대용 64 비트 코드에서 12 대신 16 대신 16을 사용하는 경우가 있습니다 (그러나 8을 사용합니다) 32 비트 코드).


답변