자료형(Data Type)
변수(Variables)
자료형 변수명 = 초기값;
선언: Declaration 이런게 잇다 이런거 쓸거다 선언
정의: Definition 아까 쓸거다 말한 '이런거'의 내용 정의
printf(%d %p, i, &i);
int: Integer(정수) 기본 자료형 4byte
%d : Decimal 10진수
%p 메모리 주소 16진수
int i = 10;
&i 변수의 메모리 주소
8bit - 1byte
8bit 16bit 32bit(4byte) 64bit 등등 cpu가 한번에 처리할 수 있는 양
32bit 코딩이기 때문에 int가 4byte이며 4byte,32bit인 int가 연산이 가장 빠름
float: Floating-point(실수) 부동(浮動)소수점
4byte
8bit 정수부 |
8bit 정수부 |
8bit 실수부 |
8bit 실수부 |
고정 소수점
8bit | 8bit | 8bit | 8bit |
정수부와 실수부의 위치가 변동 가능
부동 소수점
변수를 1bit 단위로 지정할 수는 없음
메모리의 최소 관리 단위가 1byte이기 때문에 최소 1byte씩 사용 가능하다
sizeof() 메모리 크기 반환 반환형 iong iong
sizeof(int) iong형 반환을 해야하는데 %d로 출력해서 워닝 뜸
#include <stdio.h>
void main(void){
int i = 10; //변수 생성, 초기화
i = 7; // 변수 값 변경
printf(" i: %d (%p)\n", i, &i);
printf(" int size: %d Byte\n\n", sizeof(int)); // sizeof를 %d로 출력해서 워닝 발생
float f = 3.14f;
printf(" f: %f (%p)\n", f, &f);
printf(" f size: %d Byte\n\n", sizeof(f));
int ftoi = 3.14f;
printf(" ftoi: %d / %f\n", ftoi, ftoi); //int형 변수는 %f로 정상적으로 출력할 수 없음
float itof = 10;
printf(" itof: %d / %f\n\n", itof, itof); //float형 변수는 %d로 정상적으로 출력할 수 없음
float x = i + f;
float x1 = f + i;
printf(" i+f: %d, %f\n", x, x);
printf(" f+i: %d, %f\n\n", x1, x1);
char c1 = 'a'; // 기본적으로 사용되는 char는 signed char, '부호가 붙은' char 부호 비트를 사용하고 싶지 않을 때는 unsigned char 명시
unsigned char c2;
printf(" c1: %c ", c1);
printf(" c1: %c\n", 65); // A의 아스키코드 65, 65를 문자형으로 출력하면 A
c1 = 128;
printf(" c1: %d ", c1); // -128로 출력됨. 8bit중 첫번째자리, 128 자리는 부호 비트임. 0이 되면 양수 1이 되면 음수가 되므로 표현 가능한 수는 최대 +127
// 맨 앞자리가 1이여도 일단 1000 0000 을 128로 읽은 뒤에 맨 앞이 1이면 -을 붙일 뿐이다~
// 1000 0001 이면 -128에 +1을 한거기 때문에 -127이 된다, 그 뒤로는 계속 +1이된다. 최종적으로 표시가능한 범위는 -128~(0)127
c2 = 200;
printf(" c2: %d\n", c2); //c2는 unsigned char이기 때문에 정상적으로 출력, signed는 부호 비트 검사를 하지만 unsigned는 건너뛰기 때문에 훨씬 빠름
printf(" char Size: %d Byte\n", sizeof(char));
short s = 5; //풀네임 signed short int, unsigned short int 가능
printf(" short Size: %d Byte\n", sizeof(short)); //int의 절반 크기. 속도는 int가 가장 빠르지만 메모리를 아끼기 위해서 unsigned short int와 unsigned char 등을 사용 닌텐도는 unsigned가 필수구나!
long l = 100; // 풀네임 signed long int
printf(" long Size: %d Byte\n", sizeof(long));
long long ll = 1000; //signed long long int
printf(" long long Size: %d Byte\n", sizeof(long long));
//Double Precision Floationg-Point 두배 정밀한 부동 소수점. 실수는 부호를 뗄 수 없어서 unsigned가 없음 연산속도는 float과 같음, 메모리는 두배 먹음
//게임 코딩에서는 int가 연산 속도가 가장 빠르기 때문에 실수를 정수로 바꿔서 int 연산을 한 뒤에 다시 실수로 변환하는 방식을 사용하기도 함
double d = 123.456;
printf(" double Size: %d Byte\n\n", sizeof(double));
//컴퓨터가 음수를 구하고 0을 구하는 방법. 1의 보수법을 취한 뒤 1을 더한다 -> 2의 보수
//Type Casting. Type Conversion
i = f; // 묵시적 형 변환
i = (int)f; //명시적 형 변환은 내가 인지하고 사용한 것이기 때문에 워닝이 발생하지 않음 빌드 다시 하면 사라짐
printf("(float)i: %f\n", (float)i); //명시적 형 변환 i의 태생은 int형인데 출력하는 순간에 (float)을 넣어서 그 순간에만 float로 바뀜.(강제 )
float result = (float)5 / 2; // 그냥 5/2는 int형 연산이라 2.000으로 저장됨
//협업할 때 한눈에 보고 알 수 있도록 모든 것을 명확히 표시하는게 좋다 괜히 한번 더 생각할 필요 없게한다. 깔끔담백
// 쓸데 없는 형 변환이 발생하지 않도록 자료형을 최대한 맞춘다. 메모리와 속도 낭비. 스위치는 연약하니까
//(float)5/2나 5.0/2.0하면 정상적으로 동작됨 하나만 형 변환해도 정상작동 되는 이유는 자료형이 섞여있을 때에는 더 정밀도가 높은 자료형으로 계산됨. '자료형의 승격'
printf("result: %f\n", result);
char t1 = -128;
unsigned char t2 = t1;
printf("%d %d", t1, t2);
}
'CS > C' 카테고리의 다른 글
20240108 C - 함수 (0) | 2024.01.08 |
---|---|
20240105 C - 변수 (1) | 2024.01.05 |
20240104 C - 조건문 (1) | 2024.01.05 |
20240103 C - 연산자 (1) | 2024.01.03 |
20231229 C - HelloWorld (0) | 2023.12.29 |