프로그래밍/C++

C++ 게임프로그래밍전문가자격증 필기 21-2 B형 2번 포인터 문제

우대비 2022. 8. 17. 09:14
반응형
#include <iostream>

int main()
{
     int* p = new int[5] { 1, 2, 4, 8, 16 };
     int value1 = p[4] - p[1];
     int value2 = (p + 4) - (p + 1);
     int value3 = (long)(p + 4) - (long)(p + 1);
     std::cout << value1 + value2 + value3;
     return 0;
 }

출력 값은 29

 

value1 = 16 - 2 = 14

value2 = 
    1. 002E58CE  mov         eax,dword ptr [p]  
    2. 002E58D1  add         eax,10h  
    3. 002E58D4  mov         ecx,dword ptr [p]  
    4. 002E58D7  add         ecx,4  
    5. 002E58DA  sub         eax,ecx  
    6. 002E58DC  sar         eax,2  
    7. 002E58DF  mov         dword ptr [value2],eax

1. p의 주소값을 eax로 보냄

2.eax에 10h(16)을 더함

3. p의 주소값을 ecx로 보냄

4. ecx에 4를 더함 (2번째에 있는놈은 4)

5. eax 빼기 ecx

6. eax를 오른쪽으로 2번 시프트함

7. value2에 eax의 값을 넣음 (3)

 

- 'p는 주소값'을 나타내고 '*p는 주소 안'의 값을 나타냄

'주소 + 1을 한다는 것'은 '그다음 주소로 넘어가는 것'을 의미하는데

int는 4byte를 할당 받기 때문에 주소값 + 4를 해야 다음 주소로 넘어감

다시 말해 'int에서의 주소 + 1 은' 실제로는 4를 더하게 되는거

즉 (주소값 + 4) - (주소값 + 1) = (a + 16) - (a + 4) = 12

 

그럼에도 오른쪽 시프트를 2번 하는 이유는

int의 경우 플랫폼(16bit, 32bit, 64bit)에 따라 크기가 달라지는데 모든 플랫폼에서 동일한 결과값이 나올 수 있도록

1로 만드는게 아닌가~~~ 하는 나의 뇌피셜~

 

value3 = 
    1. 002E58E2  mov         eax,dword ptr [p]  
    2. 002E58E5  add         eax,10h  
    3. 002E58E8  mov         ecx,dword ptr [p]  
    4. 002E58EB  add         ecx,4  
    5. 002E58EE  sub         eax,ecx  
    6. 002E58F0  mov         dword ptr [value3],eax

1. p의 주소값을 eax로 보냄

2.eax에 10h(16)을 더함

3. p의 주소값을 ecx로 보냄

4. ecx에 4를 더함 (2번째에 있는놈은 4)

5. eax 빼기 ecx

7. value2에 eax의 값을 넣음 ( 12 )

 

얘는 오른쪽 시프트를 안하는 것을 볼 수 있습니다. 

그 이유는 뭐냐 int와는 다르게 long은 모든 플랫폼에서 동일하게 4byte를 사용합니다

따라서 모든 플랫폼에서 동일한 결과값이 나오도록 조정할 필요가 없기 때문에 시프트를 안하는게 아닌가~ 하는 저의 뇌피셜~

반응형
LIST

'프로그래밍 > C++' 카테고리의 다른 글

동적할당  (0) 2022.10.20
초기화 리스트  (0) 2022.10.18
C++ 정수  (0) 2022.08.12
가변인자  (0) 2022.08.11
C++ 입출력  (0) 2022.08.11