1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

#include <stdio.h> int main(void) { int n = 7; printf("n: %d", n); printf("&n: %x", &n); printf("&n: %lx", &n); printf("포인터 하나당 크기는 %ld 바이트 ", sizeof(void *)); printf("&n: %p", &n); printf("================================ "); printf("&n %p", &n); printf("&n %p", (void*)((int)&n << 4)); printf("&n %p", (void*)((int)&n << 8)); printf("&n %p", (void*)((int)&n << 12)); return 0; }


디시때문에 줄바꿈은 다 지워짐 ㅡㅡ

&n은 정수를 가리키는 포인터인데, (int)로 인해 32비트 정수가 되어버림.

32비트인 상태로 비트쉬프트를 하니 앞의 8자리는 싹 잘린 채로 비트쉬프트를 하게 되고, (shl rax, 4 가 아닌 shl eax, 4)

(void*) 형변환 때문에 어셈블리에 cdqe가 들어가고,  DWORD를 QWORD로 변환할때 2의 보수까지 적용되어 앞에  0xffff가 붙는 수도 있음.



해결책


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

#include <stdio.h> #include <stdint.h> int main(void) { int n = 7; printf("n: %d", n); printf("&n: %x", &n); printf("&n: %lx", &n); printf("포인터 하나당 크기는 %ld 바이트 ", sizeof(void *)); printf("&n: %p", &n); printf("================================ "); printf("&n %p", &n); printf("&n %p", (void*)((uint64_t)&n << 4)); printf("&n %p", (void*)((uint64_t)&n << 8)); printf("&n %p", (void*)((uint64_t)&n << 12)); return 0; }