책 한 권을 제대로 읽어보지 않았다는 게 가끔은 기초가 너무 부족하다는 느낌을 줄 때가 있다.
몰라도 되지만, 가끔은 버벅거리거나 설명이 안되는 그런 부분을 채우기 위해 시작!
#include <stdio.h>
int main(void)
{
printf("%o\n", 12); // 8진수
printf("%x\n", 12); // 16진수 대문자
printf("%X\n", 12); // 16진수 소문자
return (0);
}
컴퓨터에게 10과 10.0은 다르다. 정수는 가장 빠르고 정확하게 연산될 수 있는 형태이므로, 가능하다면 정수 상수를 사용하는 게 좋다.
1) 절댓값 변환 ex) -10 → 10
2) 2진수로 변환
00000000 00000000 00000000 00001010
3) 0과 1을 바꿈(1의 보수)
11111111 11111111 11111111 11110101
4) 1을 더함
11111111 11111111 11111111 11110110
🐱 실수 상수 오차(p77) -> 설명이 좀 아쉬운데..
“변수”를 선언할 시 메모리에 저장 공간을 확보하며 대입연산자(=)로 변수값을 초기화 하거나 저장할 수 있다. 초기화 하지 않은 변수에는 쓰레기값(garbage value)이 들어 있으므로 반드시 초기화 해주어야 한다.
🐱 IEEE754 표준의 개념과 오차 발생 이유
- 정수형을 기본으로 사용하고 꼭 필요한 경우에만 실수형을 사용한다.
- 실수형은 유효 숫자가 많은 double형을 기본으로 사용한다.
🐱 p107) scanf, gets, strcpy 등 메모리 침범 문제를 일으키는 함수를 사용할 때마다 #define선언이 소스 코드에 포함되어 있어야 한다.
void *ft_memcpy(void *dest, const void *src, size_t n)
{
unsigned char *d;
const unsigned char *s;
unsigned char *origin;
d = dest;
s = src;
origin = d;
while (n--)
*d++ = *s++; // 이런 게 증감연산자
return origin;
}
(++a) + a (++a)
하나의 수식에 같은 변수를 두 번 이상 사용할 때, 그 변수에는 증감 연산자를 사용하면 안 된다.
컴퓨터 구조에서 활용할 내용 있는지 체크 + 추가
(자료형)피연산자
#include <stdio.h>
int main(void)
{
int a = 20, b = 3;
double res;
res = ((double)a) / ((double)b);
// a,b를 double형으로 선언하면 편할 것 같지만, 저장 공간이 크고
// 연산 속도가 느리며 무엇보다 오차가 발생하므로 기본적으로
// int형을 기본으로 사용하는 것이 좋다.
printf(" a = %d, b = %d\n", a, b);
printf("a / b의 결과 : %.1lf\n", res);
margin-right:10px;" />
a = (int)res;
printf("(int) %.1lf의 결과 : %d\n", res, a);
return (0);
}
아래 내용은 C언어 기초: 암시적 형변환과 명시적 형변환을 참고해서 작성했음.
1. 암시적 형변환(Implicit Type Conversion): 다른 자료형 간의 정보를 저장할 때 컴퓨터가 알아서 자료형에 맞게 내용물을 바꿔서 저장해주는 것. 대놓고 말하지 않아도 저렇게 쓰면 니가 알아서 바꿔. 데이터 손실 가능성이나 오류 없이 변환이 가능한 경우에만 이뤄짐. (자동 형 변환)
#include <stdio.h>
int main(void)
{
int num;
float Fnum = 123.987;
num = Fnum;
printf("%d\n", num); // num에 정수만 들어갔다!
Fnum = num;
printf("%f\n", Fnum);
printf("%f\n", Fnum + num); // 123.000000 + 123 = 246.000000
printf("%d\n", Fnum + num); // 오잉??
}
암시적 형변환의 특징은 서로 다른 자료형 간의 연산이 생겼을 때, 결과값을 저장할 자료형을 지정해주지 않으면 무조건 우선 순위가 더 높은 자료형으로 저장된다는 것이다.
그렇기 때문에, 컴퓨터는 int+float연산의 결과값을 float로 저장했다.
그런데, float보다 우선 순위가 낮은 int형으로 연산 결과값을 표현하려니, 데이터 손실이 일어나 다 날아가 버리고 0으로 출력!
printf("%d\n", Fnum + num); **암시적 형변환**// 246이 나올 줄 알았는데 0이 나왔다.
char < int < long int < unsigned int < float < double
2. 명시적 형변환(Explicit Type Conversion): 변수의 타입을 강제적으로 프로그래머가 변환하는 방법(casting). 데이터 손실이 발생할 가능성 있음
(변환하고자 하는 타입)변수명
아래에서는 (int)Fnum + num 이 부분
#include<stdio.h>
void main()
{
int num;
float Fnum = 123.953;
num = Fnum;
printf("%d\n", num);
Fnum = num;
printf("%f\n", Fnum);
printf("%f\n", Fnum + num);
printf("%d\n", (int)Fnum + num);
}
마지막 결과값에 대해 자료형을 확실하게 알려줌. 그러니 결과값이 246
#include <stdio.h>
int main(void)
{
int a = 10;
double b = 3.4;
printf("int형 변수의 크기: %d\n", sizeof(a));
printf("double형 변수의 크기: %d\n", sizeof(b));
printf("정수형 상수의 크기: %d\n", sizeof(10));
printf("수식의 결괏값의 크기: %d\n", sizeof(1.5 +3.4));
printf("char 자료형의 크기: %d\n", sizeof(char));
return 0;
}
대입식도 된다.
코드를 간략히 만들어주는 효과. 매크로 함수에 사용하면 좋으나 가독성을 떨어뜨릴 가능성이 있어서 필요한 곳에만 사용해야 한다.
단항 연산자 > 이항 연산자 > 삼항 연산자
산술 연산자 > (비트 이동 연산자) > 관계 연산자 > 논리 연산자