CreamPuff's HACK LAB

[코딩 연습/C] 5일차 (026~035) 본문

이전 글

[코딩 연습/C] 5일차 (026~035)

CreamPuffx2 2019. 5. 10. 00:51

코딩 연습 출처 : 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의 변수)'가 필요하다."