[WHS] 컴퓨터구조 일부분

각 타입(ex. int , char 등등)들은 바이트수에 따라서 각각의 크기들을 가지고 있다.



                                                            


                                                                                                                (크기 : 바이트단위)



이런식으로 C언어의 sizeof 메서드를 이용하여 각각의 타입 크기가 몇인지 알아낼 수 있다.

또다른 다양한 타입의 크기를 알아보고 싶으면 문서를 참조해보는 방법이 있다.

데이터타입들은 다 컴퓨터가 해석하기 위해서 이진수로 해석이 되어진다.

char 자료형(1바이트 = 8비트)을 그림으로 표현하자면



이런식으로 방이 8개 있다고 생각하면 편하다.
예를들어 10을 이진법으로 표현하면 1010으로 표현되어진다.

-와 +를 표현하기 위해서 컴퓨터는 마지막의 비트자리를 +/-를 구분하는 비트로 정한다.



최솟값(즉 char이 -128)인 값에서 -1을 하게되면 어떻게 될까?


보는바와 같이 이미 한정된 크기에서 더 늘리려 하니까 값이 뒤집힌걸 볼 수 있다.
int도 마찬가지로 -에서 +로 넘어간것을 볼 수 있다.

이러한 현상을 언더플로우라고 부른다.
(반대로 최댓값에서 +1 한것을 오버플로우라고 부른다.)

그래서 이러한 불상사가 발생하지않도록 값을 넘을 수 있는 상호작용들이 있는지 점검해봐야한다.

그리고 이런 특별한 구조는 각 비트들을 껏다 켰다 하면서 숫자를 바꿀 수 있다.
(여기서 +/-를 구분하는 비트도 숫자를 표현하는 비트로 생각한다)

10을 예시로 설명해보면 아까도 말했듯이 1010으로 표현할 수 있다.

여기에 대해서 두번째의 비트를 끄고 싶은 경우에 다른 방에 두번째 비트를 켜준다.



그리고 여기서 NOT연산을 해서 반전시켜준다.




여기서 and연산을 통해 연산을 해주게되면



최종적으로 원하는 두번째 비트를 끌 수 있게된다.

이것을 C언어로 구현을 하게되면






이런식으로 구현할 수 있다.

그 다음으로 C언어는 컴퓨터가 해석할 수 있도록 해주는 작업이 필요하다.

그것은 컴파일이라는 작업이 필요하다.

다음에 나올 코드들을 컴파일 하려한다.


아래에 나와있는 코드를 컴파일하기전에 먼저 전처리과정을 통해 .i파일을 만들어주어야 한다.



.i파일은 이런식으로 코드에서 쓰고있는 모듈들을 다 불러오게 되므로 파일의 크기가 커진다.



그다음에 .s확장자를 가지고 있는 기존 코드의 어셈블리어가 만들어지게된다.
이걸 통해 cpu에서 기계어를 통해 대응되는 어셈블리어를 해석하여 코드들이 실행되어지게 만들어준다.


최종적으로 컴퓨터가 해석가능한 .o확장자를 가진 기계어 파일이 만들어지게된다.

이 파일은 이진법으로 되어있어서 일반적인 방법으로 볼 수 없기에 010 editor나 hex editor를 통해
볼 수 있게된다.

댓글

이 블로그의 인기 게시물

SSRF(Server-Side-Request Forgery)