본문 바로가기

2014 C/3월

2014.03.20


--

이중 중첩 for문을 사용하였다.

15번째줄에서 16번동안 연속해서 *ucpdata(iNum)의 메모리속의 내용을 출력하라 명령하였고. ( ++ucpdata 로 한칸한칸 메모리를 옮겨가며)

for문에서 벗어나면 \n으로 줄바꿈명령을 수행한 후에 13 번째줄로 돌아가 다시금 ucpdata의 메모리를 읽고있다.





이 *.c문을 비주얼스투디오로 열어보았다.



3개의 공간으로 나누어서 나오게된다.

왼쪽은 '주소값' 중간은 명령한 '출력내용(iNum)' 오른쪽은 '아스키코드'이다.

*그런데 4D와 5A는 아스키코드 MZ로 출력이 확인되는데 90 00 03 등등... 은 .으로 나온다.

아스키코드에서는 31이하의 제어문자는 -> .  (ex:00)

아스키코드는 8bit 이기때문에 8bit이상(0~127)의 문자도 -> .   (ex:FF,90)









구냥 코드 읽고 이해하자

일단 29번째줄 uCpdata>130 (메모리의 정수가 127보다 크면 ->.을 출력한다.)

밑에도 똑같이 이해하쟝 ^^~

%c = 1개의 Character를 입력받는다. 띄어쓰기, 엔터 등도 모두 1글자 이므로 %c로 받을 수 있다.

코드대로 

왼쪽은 Address 문! 띄우고 *ucpdate(iNum)메모리 출력문! 띄우고 오른쪽은 아스키코드입력란! 






이제 이걸 DOS창으로 띄워보자!

위에 코드 ㅠㅠ... *ucpdata = '.'; 이걸 쓰면 안댄...다..

printf(".");로 고치자!

31번째줄..34번째줄!

그리고 37번째줄에 else 를 추가하여 printf문을 else문 안에 써주자..

이롷게 ㅠㅠ..

이렇게 코드를 수정하자...ㅋㅋ...(리눅스에선 됐는데 도스로 옮겨오니 안댐... 코드를 잘못짠것 같다ㅠㅠ) 위에랑 비교해서 틀린점 확인!

출력!



-과제과제!-






fnum속에 있는 메모리를 출력해보자.


fnum은 3.25이다. 그런데 왜 00 00 50 40 이 나왔을까?

여기서 알아두고 가야할것은 리틀 엔디언 방식이기 때문에 메모리가 뒤집혀 있다는 것이다.

원래


40 

50 

00 

00 

의 내용이

00 

00 

50 

40 

이렇게 출력된 것.


23.125

의 소수가 있다고 생각하자.

23.125를 2진수로 바꾸면 -> 10111.001가 된다.

10111.001 에서 소숫점을 앞으로 옮겨 1.0111001 *2^4 (2^4승을하면 소숫점이 10111.001로 돌아옴)

(2의 4승인걸 알았으니)

4 + 127[책에적혀있다구함]을한다. 그럼 131이 나오는데 이것을 2진수로 옮기면


 1

 0

 0

 0

 0

 0

 1

이 되는데 이것이 바로 지수부이다. 0111001은 가수부^^



이것을 적으면

[부호] [                                 지수부                                      ][나머지 쭉 가수부->

 0

 1…


을 4단위씩끊어서



[                 4                   ][                   1                  ][                   B                  ][                  9                   ]


가 나오게 된다! 그렇다면 이제 다 구한것인데



41 

B9

00 

00 

                                                                 ↓

00 

00 

B9 

41 


로 메모리는 저장된다!!




->여기서 확인할 수 있는것은 printf가 변수 = 함수 이렇게 올수 있다는것, 

심볼테이블에서 심볼명에 변수가 아닌 함수도 추가될 수 있다.


자료형 

심볼명(변수명) 

주소값 

int,double… 

변수,함수 

주소값 


이렇게 알 수 있는것은 함수도 주소값이 있다는 것!

그렇다면 함수의 주소를 출력해보자.



->여기서 확인 가능한 것은 함수끼리의 주소값이 비슷~ 하다

004010

0040

이렇듯 알 수 있는 것은 함수끼리 주소가 모여있고 변수끼리 주소가 모여있다는 것!!

3번째에 출력된 변수는 0040… 이 아닌 00000064가 되어있다~ (함수가 아니라서!)

 







  

(차차 계속 나와서 지금은 이렇게만 알고있으면 된다는데 ㅠㅠ..)








man(메뉴얼의 단축어)

(리눅스에서 'man 알고싶은것' 을치면 메뉴얼이 뜬다.)

(리눅스에서의 찾기 (Ctrl+F)의 기능 = '/찾을단어')

man -3 printf



  

책의 예문을 보면 int main(void){} 라고 써져있는데 void는 인자가 없다는 뜻이기에 생략 가능하다.








'2014 C > 3월' 카테고리의 다른 글

2014.03.24  (0) 2014.03.24
2014.03.21  (0) 2014.03.21
2014.03.19  (0) 2014.03.19
2014.03.18_2  (0) 2014.03.18
2014.03.18  (0) 2014.03.18