정수형 자료형
정수 뒤에는 여러가지 접미사가 붙을 수 있다. 접미사가 붙음으로서 똑같은 정수지만 타입을 명확하게 명시함으로서, 정확한 타입을 전달할 수 있고 범위를 넘어서는 오버플로우를 예방할 수 있다. 접미사는 대소문자를 구분하지 않는다.
접미사 | 의미 | 예시 | 타입 |
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 의 보수라고 한다. 보수를 찾는 방법은 다음과 같다.
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" 가 적혀진 메모리 영역을 찾아가서 메모리 값을 덮어 쓸 수 있다는 것이다.
Kenerl 개발자가 아닌 이상 메모리 영역은 모두 가상 메모리 개념이라고 생각 하면 된다.
그래서, 메모리 에 대해서 이야기 하자면 메모리의 Data 영역에는 아래의 영역으로 나뉘어 지고 메모리에 대한 접근 권한을 이야기 할 수 있다.