메모내용

int

정수형 자료형

  • char(1)
  • wchar_t(2) = L’A’ // wchar_t 는 유니코드 문자열을 저장합니다.
  • short(2)
  • int(4) = 20;
  • int(4) = 10'000'000'000; // ' 으로 구분할수도 있다. 값은 ' 이 없는것과 동일하다.
  • long(4) = 20L;
  • long long(8)
  • size_t 가 등장하는 경우도 있다. 이 경우는 `long long` 과 마찬가지로 8byte 정수지만. __int64 를 타입 재정의 하여 이름을 바꾸었을 뿐이다.
  • 정수 리터럴 뒤에 붙는 접미사

    정수 뒤에는 여러가지 접미사가 붙을 수 있다. 접미사가 붙음으로서 똑같은 정수지만 타입을 명확하게 명시함으로서, 정확한 타입을 전달할 수 있고 범위를 넘어서는 오버플로우를 예방할 수 있다. 접미사는 대소문자를 구분하지 않는다.

    접미사 의미 예시 타입
    u unsigned 1234u unsinged int
    l long 1234l long int
    ul unsigned long 1234ul unsigned long
    ll long long 1234ll long long int
    ull unsinged long long 1234ull unsinged long long
                    
                        char b = 0;
                        b = 255 ; // -1
                        // 255 는 8칸 모두 켜진 전구이기 때문이다. 즉 1111 1111 은 위와 같이 -1 이 된다.
                    
                

    컴퓨터가 음수를 표시하는 법 ( 보수 찾기 )

    컴퓨터에서의 음수표현은 어떻게 할까? 컴퓨터는 보수 덧셈 방식을 사용한다. 1의 보수는 not 연산으로 구현하고 2의 보수는 1의 보수+1 이다. 자세하게는... +1 은 0x 0000 0000 ... 0000 0001 이다. -1 은 몇일까? Sign Bit 만 바꿔서 0x 1000 0000 ... 0000 0001 일까? 그렇다면 두 비트를 더하면 0x 1000 0000 ... 0000 0010 이다. 1 + (-1) = 0 이어야 하는데 이는 -2 된다. 컴퓨터에서 -1 은 +1 을 0 으로 만드는 수다. 컴퓨터에서는 -1 은 +1 의 보수라고 한다. 보수를 찾는 방법은 다음과 같다.

    1. 0 을 1로 바꾼다음
    2. +1 을 해주자

    예시 : 1 ) 2의 보수 찾기 (-2)

    0x ... 0000 0010 == 2 ~2 0x ... 1111 1101 +1 0x ... 1111 1110 == -2

    1 바이트의 경우 8칸만 표현할 수 있기 때문에, 8칸을 넘어가는 비트는 표현될 수 없고, 0 만 남게 되는 것이다.

                    
                        #include <stdio.h>
    
                        int main(void)
                        {
                            int a = 0x00112233;
    
                            printf("0x%08X\n",a);
                            printf("%d\n", 10-5);
                            printf("%d\n, 10+(~5+1)");
                        }
    
                    
                

    문자열

    문자열 시작주소부터 '\0' 문자 까지 읽는게 기본이다. 문자열 또한 정수형으로 사이즈는 아래와 같습니다.

    문자(배)열 상수화

    char* str = "hello world";

    에서 hello world 는 문자열이다. 문자열은 메모리 어딘가에 할당되어있고, 이는 상수화된 문자열 이다. ( 문자열 자체가 상수가 아니다. ) const char* 으로 메모리 어딘가에 할당되었고, 이 것의 주소를 str 변수가 값으로 가지는것이다.

    문자열 상수는 수정할 수 있는가?

    수정할 수 있다.

    문자열이 상수화 되었다는것은 const 가 붙어 메모리에 대한 접근 권한 ( RWX ) 이 R-- 으로 되었을뿐 문자 배열 이 할당된 것 과 동일하다. 즉 visual studio 의 디버거 를 실행하고 메모리를 오버라이딩 하면 바뀐다. char str* = "hello world" ; 에서 "hello world" 가 적혀진 메모리 영역을 찾아가서 메모리 값을 덮어 쓸 수 있다는 것이다.

    문자열 관련 함수

    참조 - IBM StringFunction

    string.h

    Kenerl 개발자가 아닌 이상 메모리 영역은 모두 가상 메모리 개념이라고 생각 하면 된다.

    그래서, 메모리 에 대해서 이야기 하자면 메모리의 Data 영역에는 아래의 영역으로 나뉘어 지고 메모리에 대한 접근 권한을 이야기 할 수 있다.