CreamPuff's HACK LAB
[코딩 연습/C] 5일차 (026~035) 본문
코딩 연습 출처 : https://cafe.naver.com/funcc
※ 아래 내용은 글쓴이 개인적으로 공부하며 끄적인 것으로,
정확한 정보가 아닐 수 있습니다.
정확한 정보는 카테고리 'C'나,
전문 서적을 참고하세요!
026. 자료형의 크기
"C언어가 제공하는 기본 자료형은 6개"
char | 1 byte |
short | 2 byte |
int | 4 byte |
long | 4 byte |
float | 4 byte |
double | 8 byte |
027. C언어가 기본으로 인식하는 자료형
"A는 정수 65로 변환되어 인식한다."
"정수는 int, 실수는 double로 인식한다."
따라서 A는 int형으로 인식, 즉 4byte로 출력된다.
문자열 "programming"의 경우 11자이므로
11byte가 출력될 것을 기대하였으나, 12byte로 출력되었다.
무언가 비밀이 숨겨져있다..!
*이는 문자열의 마지막에 자동으로 NULL문자가 추가되기 때문이다.
028. ASCII CODE 보기
이 소스코드에서 제일 중요한 부분은
%c의 인자를 0부터 127까지 증가하는 변수인 i로 한 것!
결국 C는 숫자를 문자로 출력할 때 아스키 코드를 참조한다!
중간, 중간 비어있는 곳은 스페이스, 개행 문자 등
029. 정수와 문자와의 관계
"A는 메모리에 65로 변환되어 저장된다."
(아스키 코드로 치환되어 저장된다?)
메모리(컴퓨터)는 문자를 저장할 수 없다.
컴퓨터는 0과 1만 인식한다.
★ 즉, 'A' → 65 → 10001(2진수)을 저장한다.
030. 자동 형 변환(1) - 정수
입력된 인자는 서식문자에 따라 자동으로 자료형이 변한다.
45.78 -------- [%d] --------> 45
(실수) (정수형 자료형) (정수)
031. 자동 형 변환(2) - 실수
14번째 줄에서 서식문자를 %1f 입력하였는데..
1의 의미는??
2, 3으로 바꾸어도 결과는 동일했다.
%.1f의 경우에는 소수점 아래 1자리까지 출력하는 것으로 알고 있는데,
%1f도 마찬가지로 소수점 위 1자리까지 출력하는 것인줄 알았는데 아닌가보다..
일단 잘 모르겠다 넘어가즈아~
032. 강제 형 변환(cast 연산)
* 강제 형 변환 방법
1) 데이터 앞에 '(자료형)'을 붙인다.
ex) (int)35.66
2) 데이터 뒤에 자료형의 문자를 붙인다?
ex) 55.545f
int a = (int)35.678; 의 경우 애초에 int형 변수에 35.678을 입력하기에
int a = 35.678; 만 입력하더라도 a에 입력되는 값은 35로 동일하다.
근데 이걸 왜 굳이 쓸까?
키보드를 두들겨 본 결과, 강제 형 변환은 다음과 같을 때 필요해보입니다.
int a = 1; int b = 2; 의 경우,
a/b를 출력하고자 할 때!
인간적인(?) 사고로는 1/2 = 0.5가 당연히 되겠지만..
컴퓨터는 그렇지 않으니..
일단 뭐 결과값이 실수인 걸 아니까, 출력할 때는 서식문자 %f나 %lf를 써줘야겠지?
printf("%f", a/b);
이렇게 출력하면 어떻게 나올까?
a, b 모두 int형이기에 연산 결과 또한 int형이 되므로
0.5에서 .5는 버려지고 0만 남아 %f로 출력한다한들 0.000000이 출력된다 ㅠㅠ
따라서 정확하게 출력을 하려면?
a/b를 강제로 형 변환해주어서
printf("%f", (float)a/b); 로 출력을 하면 0.500000가 출력된다!
033. 그릇의 넘침(Overflow)
* signed char의 범위는 -128 ~ 127
* unsigned char의 범위는 0 ~ 255
즉, 총 0을 포함한 256개의 숫자 범위에서 음수의 범위까지 포함하느냐, 아니냐
* 생략하면 signed (음수의 범위까지 포함!)
근데 재밌는건 '범위를 벗어난 값을 어떻게 출력했느냐'이다.
b = signed형 변수이지만, 200이라는 초과 값을 가지고 있으며, 결과값은 -56이 나왔다.
왜 -56가 나왔을까?
200 - 127 = 73을 초과한 값을 가진 b
만약에 b가 범위 중 가장 작은 값인 -128에서 다시 숫자를 세어 결과를 출력한다면?
단순 숫자 계산만 하면 -128 + 73 = -55 이지만
'b의 위치'는 -55의 이전 값인 -56이다.
(-128 + 73) - 1
wow!
d도 한번 보자.
d = unsigned형 변수이지만(음수가 없는 자료형이지만),
-50이라는 음수 값을 가지고 있으며, 결과값은 206이다.
이것도 b와 같이 계산하면 된다.
50칸만큼 255부터 포갠다고 생각하면 d의 위치한 값을 알 수 있다.
(255 - 50) + 1 해주면 되겠지? 즉, 206!
lol!
불교의 윤회 사상마냥 순환한다. 오호..
★실제 메모리에 저장된 비트열을 그려보면 이해가 쉽다고 한다.
034. 값의 대입(assignment)
'='는 값을 '넣는다'는 의미(대입)
'=='는 값이 '같다'는 의미(동일)
035. 정수 맞교환
"두 변수의 값을 맞교환 시 반드시 '빈 그릇(제 3의 변수)'가 필요하다."
'이전 글' 카테고리의 다른 글
[코딩 연습/C] 6일차 (061~064) (0) | 2019.05.12 |
---|---|
[코딩 연습/C] [036~060] 컴파일러 에러로 인한 출력 오류로 skip (0) | 2019.05.12 |
[코딩 연습/C] 4일차 (021~025) (0) | 2019.05.08 |
[코딩 연습/C] 3일차 (011~020) (0) | 2019.05.07 |
[코딩 연습/C] 2일차 (006~010) (0) | 2019.05.06 |