
unsigned, signedunsigned, signed를 명시하지 않으면 signed 취급char: 컴파일러마다 다름char를 아스키(0~127)가 아닌 정수형으로 사용하려고 하면,signed, unsigned표기해야함| 자료형 | 크기 | 범위 | printf |
|---|---|---|---|
char | 최소 8비트 정수형 | %c | |
short | 최소 16비트이고 char크기 이상인 정수형 | ||
int | 최소 16비트이고 short크기 이상인 정수형32bit 컴퓨터가 나오면서 32bit가 됨 64bit에서도 32bit | %d | |
long | 최소 32비트이고 int이상의 크기 | %ld | |
float | %f | ||
double | |||
long double | double 이상의 크기 |
charchar가 몇 비트인지 찾는 방법 = 컴퓨터가 1Byte를 몇 비트로 쓰는지 확인limits.h 인클루드 후, CHAR_BIT를 찍어보자.#include <limits.h>
int main(void)
{
char char_size = CHAR_BIT;
return 0;
}
8이라고 뜸char = 8bit = 1ByteCHAR_BIT = char가 차지하는 비트16bit = 1Byte 쓰는거임.....int와 섞어서 사용 가능int -> enum, enum -> int # C#
enum EDay { MONDAY, TUESDAY, WEDNESDAY };
enum EMonth { JANUARY, FEBRUARY, MARCH };
EDay humpDay = EDay.WEDNESDAY;
EMonth birthMonth = humpDay; // 컴파일 오류
enum day { DAY_MONDAY, DAY_TUESDAY, DAY_WEDNESDAY };
enum month { MONTH_JANUARY, MONTH_FEBRUARY, MONTH_MARCH };
enum day hump_day = DAY_WEDNESDAY;
enum moth birth_month = hump_day; /* 컴파일 됨.. */


Byte로 반환해주는 연산자size_t
int values[30];
size_t arr_size = sizeof(values); /* 120 */
Byte 수를 반환한다.
sizeof()로 매개변수로 들어온 배열의 총 바이트 수를 반환할 수 있으려면,함수는 caller가 누구든 간에 '스택 메모리 사용량'은 컴파일 시 고정sizeof()를 찍으면, sizeof( int * ) 의 값이 나온다.void process(int nums[5]){
...
}
void process(int nums[])와 동일하다.int values[30];
const size_t num_vals = sizeof(values) / sizeof(values[0]);
/* 함수 밖에서 */
#define ARRAY_LENGTH(arr) (sizeof(arr) / sizeof(arr[0]))
/* 사용 */
const size_t num_vals = ARRAY_LENGTH(values);
size_tsize_t_t는 typedef를 했다는 힌트typedef는 다른 자료형에 별칭을 붙이는 것size_t를 typedef한 것
unsigned __int64 (64bit)unsigend int (32bit)size_t의 용도int int_arr[30];
size_t i;
for (i = 0; i < 30; ++i) {
int_arr[i] = i;
}


데이터 + 코드 + bss 존재데이터 + 코드 + bss 를 로드힙, 스택을 동적으로 로드554889e5b8697a0005dc3이라는 기계 코드로 변환되는데, 이 기계 코드가 코드 세그먼트에 위치한다.int main() { return 31337; }

값형으로 생성한 변수는 스택에 할당스택은 빌드시 '크기'를 지정되어 있고 바로바로 이어서 할당하면 되기 때문에 힙보다 빠름int main(void)
{
char buf[1024*1024];
...
}
값형이 아닌 new(동적할당)로 생성하면 힙에 할당힙할당 요청 시, OS가 메모리 힙영역에 빈공간을 찾아야하므로 스택보다는 시간 소요


g_mob_count변수 선언이 되어있지 않아 '컴파일 에러'

g_mob_count변수를 선언했더니, '링커 오류' 발생
.c는 각각, 링킹은 .o를 한번에 하니까 링킹 단계에서 발견.monster_repo.c에 있는 g_mob_count 전역 변수를 사용할 것이다.main.c의 g_mob_count는 구멍으로 남겨둬!

extern을 빼버리면 에러케이스2와 똑같은 결과

extern 붙일 수 있으나 그냥 선언하면 자동 extern.c 파일에서 extern 쓰면 사용 가능하고, 내 파일 안의 변수까지 바꿔버린다.extern의 문제로.. 다른 놈이 내 전역 변수를 못쓰게 하고 싶다!!

static 전역변수static 할 수 있다.

static + 지역 변수 시, 개념상 전역 변수

int num[4]; /* 쓰레기 값 */
int num[4] = { 10, 15 }; /* 10, 15, 0 ,0 */
int num[4] = { 0, }; /* 0 으로 전부 초기화 */

에러난다.