* 출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=549748&ref=549748
=============================================================================================
▲ 질문내용
1. 우선 %p 와 %x의 차이점이 무엇인지 알고 싶네요.
%p도 16진수로 표현 %x도 16진수로 표현. 같은 용도인데 왜 따로 사용하는 사례가 있을까요?
다른점이 있다면 %p는 빈공간에 0을 넣어서 출력하며 대문자더군요.
(8자리 출력인 것 보면 주소 값 출력과도 관계가 있는 것 같은데요 ㅠㅠ)
2. 출력명령문의 #는 무엇을 하는 녀석입니까?
그리고 #을 사용하게 되면
0x라는 값이 출력됩니다. 0x는 도대체 뭔지요 ㅠ_ㅠ; 16진수일 때만 나오는군요.
▲ 소스
main()
{
int a = 100;
// 1. %x, #사용 a변수의 주소를 16진수로 표현(10자리로 표현하며 빈공간에는 0을 넣어라)
printf("%#010x\n", &a);
// 2. %x사용 a변수의 주소를 16진수로 표현
printf("%x\n", &a);
// 3. %x사용 a변수의 값을 16진수로 표현
printf("%x\n", a);
// 4. %p사용 a변수의 주소를 16진수로 표현
printf("%p\n", &a);
// 5. %p사용 a변수의 값을 16진수로 표현
printf("%p\n", a);
}
결과값
1. 0x0012ff7c <---- %x 와 #사용. 주소 10자리로 출력 빈공간에는 0을 넣었음.
2. 12ff7c <---- %x 를 사용 주소 출력.
3. 64 <---- %x 를 사용 값 출력.
4. 0012FF7C <----- %p 를 사용 주소 출력.
5. 00000064 <---- %p 를 사용 값 출력.
=============================================================================================
%x 에서 %#x 는 0x 를 붙이라는 뜻이구요, (사용하는 사람이 많지는 않은듯 하네요)
%p 는 포인터 크기 만큼 메모리를 읽어서, 16진수로 표시합니다.
아래는 MSDN 에서 뽑아왔습니다.
%[flags] [width] [.precision] [{h | l | I | I32 | I64}]type
flags : '-', '+', '0', ' ', '#'
'-' : 오른쪽 정렬
'+' : 부호 붙임 (- 또는 +)
'0' : 앞자리에 0 을 붙임
' ' : 앞자리에 공백출력
'#' : o,x,X 와 같이 쓰일경우 진수 표시. (0, 0x, 0X)
e,E,f,g,G 와 같이 쓰일 경우 소수점 아래 무조건 표시
width : 전체 길이
.precision : 정밀도.. 일반적으로 f 와 같이 쓰이나, s 와 같이 쓰일경우 길이를 강제로 맞출때 사용. d,x 등 기타 다른 플래그도 동일.
ex: printf("%.5s", "abcdefghijklmn"); --> "abcde" 만 찍힘. (지원안되는 컴파일러도 있음)
h,l,I,I32,I64 :
h : short 크기만 읽음
l : long 크기
I : int 크기
I32 : 4 바이트 크기 강제
I64 : 8 바이트 크기 강제
w : 2byte character
type : d,f,x.p... 등 타입은 다 알고 계실거구요...