이것은 중요한 질문보다 호기심 많은 쿼리이지만 16 진수를 선행 0으로 숫자로 인쇄 할 때 왜 %#08X
다음과 같은 결과가 표시되지 0x%08X
않습니까?
전자를 사용하려고하면 08
서식 플래그가 제거되고 그냥 작동하지 않습니다 8
.
다시 나는 단지 궁금했다.
이것은 중요한 질문보다 호기심 많은 쿼리이지만 16 진수를 선행 0으로 숫자로 인쇄 할 때 왜 %#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
14F
있습니까?
i = 0;
사용하는 버전 %#
에는 0x
접두사가 포함되지 않습니다 .
%#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 비트 코드).
0x%.8X
합니까? 즉 것이다 리드 채우기를 제로로. (이것은0x
단지 서문이지만, 이미 알고있을 것입니다).