unsigned
, signed
unsigned
, 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 이상의 크기 |
char
char
가 몇 비트인지 찾는 방법 = 컴퓨터가 1Byte를 몇 비트로 쓰는지 확인limits.h
인클루드 후, CHAR_BIT
를 찍어보자.#include <limits.h>
int main(void)
{
char char_size = CHAR_BIT;
return 0;
}
8
이라고 뜸char
= 8bit
= 1Byte
CHAR_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_t
size_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 으로 전부 초기화 */