Eat Study Love

먹고 공부하고 사랑하라

SW 만학도/C

2-1. Operators / Memory in C

eatplaylove 2024. 3. 20. 22:18

https://eglife.tistory.com/32

 

2. Variables in C

아무리 봐도 불친절한 C.. 파이썬을 배우다가 와서 그런가 불편한 게 이만 저만이 아니다. 그래도 파이썬코드보다 처리속도도 빠르고, 디버깅에 유용하다니까 감내해야지 Review https://eglife.tistory.

eglife.tistory.com

 

 

 

지난 시간에 이어 이번엔 C의 Operators를 좀 알아보자

 

Operators

 

- Assignment ( A = B )

 B쪽에 있는 걸 A에 넣는다.

 

- 수학기호 계산 순서는 파이썬과 같다.

 

 

#include "stdio.h"

int main(void)
{
    int x = 1;

    x = x + 1;
    x += 1;
    x++;
    
    // 위 3개는 같다

    x = x - 1;
    x -= 1;
    x--;

	// 역시 위 3개는 같다

    return 0;

}

 

 

- 그런데 x++ vs ++x는 구분을 해줘야 한다.

 

--> y = x++ 일 땐, 일단 y=x이고 그 이후에 x에다가 1을 더한다. (  ++기호가 뒤에 있으면 뒤 후 뒤 후 이후 이후! After! )

 

--> y = ++x 일 땐, x에다가 1을 더하고 그 값을 y에다가 대입한다. --> y=x

 

#include "stdio.h"

int main(void)
{
    int x = 1;
    int y;
    int z;
    
    y = x++;
    z = ++y;

    printf("x:%d, y:%d, z:%d\n",x,y,z);
    // x=2 , y=2 , z=2

    return 0;

}
---------------
좀 더 구체적으론 아래와 같다.

    int x = 1;
    int y;
    int z;
    printf("x:%d, y:%d, z:%d\n",x,y,z);
    // x=1, y=16, z=0
    y = x++;
    printf("x:%d, y:%d, z:%d\n",x,y,z);
    // x=2, y=1, z=0
    z = ++y;

    printf("x:%d, y:%d, z:%d\n",x,y,z);
    // x=2 , y=2 , z=2

 

Memory in C

 

 

- Memory는 Compiler의 입장에서 보는 것이다.

 

- 아래가 주소가 가장 크고 ( Hexa(0~15) --> 16bit ), 제일 위에는 0이어서 제일 작다.

 

 - Global Variableglobal data section에 저장 --> 주소값이 작은 곳(위 쪽)

 - Local Variable(살아났다 죽었다 하는 친구)은 run-time stack에 저장 --> 주소값이 큰 곳(아래 쪽)

 

 - Local Var은 죽었다 살아났다 하므로 run-time-stack 영역은 늘었다 ~ 줄었다 ~ 한다.

 

하얀 부분이 우리가 C에서 쓰는 Memory 영역이다, 맨 위 Global Data Section 위는 코드자체를 저장하는 영역 (완전 lowset)

 

- Global data section에선 R4 레지스터가 Global data의 메모리 주소를 가르킨다. 그 address의 시작점을 가르킴!

  --> Global data의 시작시점을 가르킴

  --> 거기서 1 , 2, 3을 더하면서 몇 번째 Variable을 가져올지 정할 수 있다.(시작점을 알고 있으니)

 

- Local Variable의 경우

  --> Run-time stack이 사용되는 가장 높은 주소를 R5(Frame Pointer, 밑바닥주소)가 가르킨다.

  --> Local Var을 많이 사용하면 사용할수록 Run-time-stack 영역은 늘어나고,

그 끝나는 지점을 R6가 가르킨다.(Stack Pointer, Lower Level)

 

- Global data section의 밑바닥 => R4(Lower address 고정) //

Global Data를 쓰면 쓸수록 점점 주소가 증가한다(그림에서 아래방향으로)

 

 

- Run-time-stack 의 밑바닥 => R6(Lower address, 그림에서 위쪽) but! 고정은 R5(Higher address 고정, 그림에서 아래쪽)

// Local Data를 쓰면 쓸수록 점점 주소가 감소한다.(그림에서 윗방향으로)

 

 

- Heap이 뭔지, Memory사용의 구체적인 동작은 뭔지, 왜 Run-time-stack은 queue가 아닌 stack으로 다뤄야 편한지.. 그런 상세한 부분은 다~~음 시간에 계속.. To Be Continued..

 

Global Var은 메모리주소가 offset 0에서부터 증가하는 방향, Local Variable은 0에서 메모리주소가 감소하는 방(Scope 영역도 참고)

 

 

- 위 예시에서 Global Var을 하나 더 선언했으면, 메모리주소의 offset이 하나 증가한 1이었을 것이다.

(Address value Increasing~~!)

 

 

 

 

'SW 만학도 > C' 카테고리의 다른 글

5. Pointer - Motivation in C  (1) 2024.03.26
4. Function ic C - Grammer  (1) 2024.03.25
3. Control Structures in C - Condition ( While / For Loop )  (0) 2024.03.25
2. Variables in C  (0) 2024.03.20
1. Hello C !!! Sorry for late..  (2) 2024.03.19