16 진의 printf () 형식화


191

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

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

다시 나는 단지 궁금했다.


3
당신은 의미 0x%.8X합니까? 즉 것이다 리드 채우기를 제로로. (이것은 0x단지 서문이지만, 이미 알고있을 것입니다).
WhozCraig

답변:


283

#부분은 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

상단 라인은 14F0x00000007을 출력합니다. 두 번째와 세 번째는 서면으로 작동합니다.
quantumpotato

@quantumpotato-그거 ... 이상해. 첫 번째와 세 번째 줄은 생성해야하는 0의 수를 제외하고 동일합니다. 이것을 생성 한 컴파일러 / 시스템 / 코드 라인은 무엇입니까? 인쇄 한 줄이 14F있습니까?
Mike

19
인 경우 i = 0;사용하는 버전 %#에는 0x접두사가 포함되지 않습니다 .
Jonathan Leffler

그러나 16 진수는 어떻습니까? 0x43A66C31C68491C0 다음을 시도했습니다. __int64 int64 = 0x43A66C31C68491C0; printf_s ( "% # 15X % d", int64, int64); 그러나 출력은 0x43A66C31C68491C0이 아닌 0XC68491C0입니다
123iamking

위의 16 진수 0x43A66C31C68491C0에 대해, 나는 그것을 해결했습니다. 솔루션은 % # 15X가 아니라 0x % I64X입니다
123iamking

53

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

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


34

%#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 비트 코드).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.