#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를 사용합니다
따라서 모든 플랫폼에서 동일한 결과값이 나오도록 조정할 필요가 없기 때문에 시프트를 안하는게 아닌가~ 하는 저의 뇌피셜~