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
명세서의 일부. 단,0X
prefix는 길이의 일부로 카운트됩니다(따라서 사용하실 필요가 있습니다).%#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
'programing' 카테고리의 다른 글
퍼포먼스 트레이드오프 - MATLAB가 C/C++보다 우수하거나 느린 경우 (0) | 2022.08.13 |
---|---|
instance of를 호출하기 전에 null 체크가 필요합니까? (0) | 2022.08.13 |
계산된 get에 대한 스파이 기능 (0) | 2022.08.13 |
UNIX 터미널 응용 프로그램의 컬러 텍스트 (0) | 2022.08.13 |
memcpy 퍼포먼스 향상 방법 (0) | 2022.08.13 |