programing

16진수의 printf() 포맷

projobs 2022. 8. 13. 11:45
반응형

16진수의 printf() 포맷

왜 16진수로 된 숫자를 선행 0이 있는 8자리 숫자로 인쇄할 때,%#08X 같은 결과를 나타내지 않다0x%08X?

전자를 사용하려고 하면08포맷 플래그가 제거되었으며, 포맷 플래그가 제거된 상태에서는8.

#부품에 의해0x출력 문자열에 포함시킵니다.0및 그x에 기재되어 있는 「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(또는0X위해서%#X값이 다음 값이 아닌 한 출력에 부가됩니다.0를 사용하지 마십시오.#네가 원한다면0x항상 출력에 표시됩니다.

너비 필드는 다음 명령어와 조합하여 사용할 수 있습니다.0선행 0을 생성하는 플래그:%08x숫자에 선행 0을 붙여서 폭을 넓히다8모든 32비트 값에 대해 일관된 출력을 원하는 경우"0x08x".

정밀도 필드를 사용할 수도 있습니다.%.8x선두에 0을 붙여 합계를 내다8디지트그 때문에, 다음과 같이 사용할 수도 있습니다."0x%.8x"당신의 목적을 위해.

이러한 변환 사양은 변환의 일부로서 프레픽스가 생성되는 경우 다음과 같이 달라집니다.0x위해서#또는-길이가 너비로 계산되지만 정밀도 지정자에 대해서는 계산되지 않는 부호 변환의 음수에 대한 값입니다.또한 정밀도 필드는 폭 필드와 결합할 수 있습니다.

printf("|%10x|", 256)      // outputs |       100|
printf("|%010x|", 256)     // outputs |0000000100|
printf("|%#010x|", 256)    // outputs |0x00000100|

printf("|%10.8x|", 256)    // outputs |  00000100|
printf("|%#10.8x|", 256)   // outputs |0x00000100|
printf("|0x%.8x|", 256)    // outputs |0x00000100|

printf("|%10x|", 0)        // outputs |         0|
printf("|%010x|", 0)       // outputs |0000000000|
printf("|%#010x|", 0)      // outputs |0000000000|

printf("|%10.8x|", 0)      // outputs |  00000000|
printf("|%#10.8x|", 0)     // outputs |  00000000|
printf("|0x%.8x|", 0)      // outputs |0x00000000|

마지막을 사용할 것을 권장합니다."0x%.8x".

"0x"는 8자 수에 카운트됩니다.당신은 필요하다"%#010x".

주의:#0x를 0에 추가하지 않습니다.그 결과는 다음과 같습니다.0000000000- 그래서 아마 당신은 그냥 그 정보를"0x%08x"어쨌든.

%#08X변환은 다음 값 앞에 와야 합니다.0X; 이는 표준에 의해 요구됩니다.이 기준에는 그 증거가 없습니다#의 동작을 변경해야 합니다.08명세서의 일부. 단,0Xprefix는 길이의 일부로 카운트됩니다(따라서 사용하실 필요가 있습니다).%#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 v10.7.5(Lion)의 출력은 다음과 같습니다.

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

왜 이 나오는지 왜 그 이유는 불명확합니다.0X 두 의 다른 .은 나의 시켜 준다.#★★★★★★ 。


0의 처리는 기준에 따른다.

ISO/IEC 9899:2011 § 7.21.6.1 기능

깃발 와 그 는 다음과 같습니다 #★★★의 x (오류)X) 변환, 0이 아닌 결과는0x (오류)0X

(강조 추가)


「 」를 사용하고 있는 에 주의해 .%#X, 16진수에는 16진수입니다.0X 「」를 사용합니다.%#x 및 16진수에는 합니다.0x프리픽스로서 사용합니다.찮 if면면 if0x.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의 12번째 버전입니다.의의와 .최소 정밀도(표준)를 지정하기 위해 주소 형식을 안정적으로 지정합니다.정밀도를 16으로 설정하면 Mac에서는 4자리 숫자가 항상 0이지만 휴대용 64비트 코드에서 12자리 대신 16자리 숫자를 사용하는 경우가 있습니다(하지만 32비트 코드에 8자리 사용).

항상 "%p"을 사용하여 8비트의 16진수를 표시할 수 있습니다.

int main (void)
{
    uint8_t a;
    uint32_t b;
    a = 15;
    b = a << 28;
    printf("%p", b);
    return 0;
}

출력:

0xf0000000

언급URL : https://stackoverflow.com/questions/14733761/printf-formatting-for-hexadecimal

반응형