Busan IT/제어언어2015. 2. 5. 17:34

제어언어 - 포인터의 개념과 컴퓨터의 데이터 저장 방식

#1. 포인터의 개념

 

학습목표 - 포인터의 개념을 이해하고 포인터를 사용하여 값을 출력할 수 있다.

 

C에서 unsigned int uiNum; 이라는 코딩을 하게 되면, CPU에서 메모리에게 해당 형식의 변수를 만들고 메모리에 저장시키라고 명령한다. uiNum=88;의 명령어를 입력하면 uiNum88을 대입한다. 이 때 대입연산자 좌우에 형이 동등해야 대입연산자가 작동하게 된다.

 

//변수를 만들 경우 심볼 테이블을 작성하여 값을 쉽게 나타내 볼 수 있다.

//잘못된 코딩의 경우 error/warning의 메시지가 뜨는데 error시 작동이 되지 않고 //warning이 작동은 가능하되 언어에 맞지 않게 작성되었다는 코딩으로 인식한다.

//ex) int 3.9의 경우 소수점을 절삭하고 3만 표시된다.

 

unsigned int *uip;를 입력하면 unsigned int를 대상으로 하는 포인터가 된다.

uip=&uiPNum;을 입력하면 uip&uiNum 둘 다 주소를 나타내는 변수로 형이 같음으로 작동하게 된다.

// *를 적고 변수명을 적으면 주소를 저장하는 포인터 변수가 된다.

// ‘*’asterisk[as-tuh-risk]로 읽는다.



UiNumuiP의 값과 주소를 출력한다. 이 때 *uiP를 입력한다고 가정해보자. 이 때 *곱셈이 아니라 주소를 찾아가라는 뜻으로 인식된다. 이것은 통상적으로 uiPuiNum을 가르킨다고라고 말한다.

 

그러므로, *uiP를 출력하라는 말은

1. *uiP의 값(uiNum)이 나타내는 주소(uiNum의 주소)를 찾아가

2. 이 주소(uiNum의 주소)가 가지는 변수의 값(88)을 출력하라는 뜻이다.

#2. 포인터의 기본개념 복습과 캐스팅

 

학습목표 - 포인터에 대한 완전한 이해와 변수에 값 대입시 표시 방법을 원하는 대로 바꿀 수 있다.

 

실습 - 포인터의 이해)

unsigned int5개의 값을 선언한 후(90, 80, 70, 60, 50) 포인터 변수를 하나 선언하여 *uip값이 모두 선언한 unsigned int의 변수 값을 출력하도록 코딩하여라.




실습 - 캐스트 연산자를 활용한 경고 표시의 제거

1. character함수를 선언하여 255가 넘는 수를 넣고 캐스팅 연산자를 활용하여 warning을 없애본다.

2. unsigned int함수를 선언하여 16진수(12C) 넣고

 

 

//warning이 뜰 경우 사용자가 이것을 인식하고 있음을 표시하기 위해 캐스트 연산자를 사용한다.

 

캐스트 연산자는 1. 묵시적 2. 명시적 캐스팅이 있다.

1. 컴파일러에서 경고는 띄우지만 오류를 내지 않고 실행하는 경우.

2. 사용자가 캐스트 연산자를 활용하여 적어주는 것.

 

실습 - 진수 표시의 변환)

unsigned 변수를 선언하고 16진수 12C를 넣은 후 16진수로 표현해 본다.

 

 

// 16진수 uiNum = 0x12C;

// 8진수 uiNum = 012C;

#3. 컴퓨터의 데이터 저장 방법

 

학습목표 - 컴퓨터의 데이터 저장 방법을 이해한다.

 

컴퓨터는 메모리에 데이터를 어떻게 저장 하는가에 대한 학습

 

실습 - 컴퓨터의 데이터 저장 방법 이해)

16진수로 1부터 8까지의 수를 입력한 후에 2자리씩 출력하는데 매 출력마다 주소에서 1을 더하여 총 4번 출력해 본다.

 




 

컴퓨터는 빠른 산술계산을 위해서 정수는 뒤집어서 저장한다. 대신 대소비교(논리)는 느려진다. PC의 경우에는 숫자를 뒤집어서 넣고 슈퍼컴퓨터는 숫자를 그대로 집어넣는다. 산술과 논리는 양립한다.

 

컴퓨터 용어로써 숫자를 뒤집어 넣는 방식을 little endian이라고 부른다. 숫자를 그대로 넣는 방식은 big endian이라고 부른다.

 

ucP1씩 더할 때 주소에서 1byte(8bit)씩 커짐으로 16진수(4bit)를 나타내는 자리수에서는 2칸씩 이동하게 된다. 왜냐하면 변수 값에 1을 더하기 때문에

#4. IEEE 형식

 

학습목표 - IEEE를 형식에 맞게 실수를 표현할 수 있다.

 

현재 수업의 초점은 C를 바탕으로 컴퓨터에 대한 이해를 위한 수업이다.

 

float4byte의 실수를 저장하는 명령어이다. 실수를 저장하는 독특한 방법이 있다.

 



 

부호비트(1)/지수부(8)/가수부(23)

 

위와 같은 형태로 바꾸기 위해서는 정규화 과정을 거쳐야 한다.

 

부호비트는 양수일 때 0, 음수일 때 1이고

지수부는 “X-127”형태에서 지수가 1.*인 상태를 맞추기 위한 X의 값을 넣어줘야 한다.

 

 

 

 

 

 

 

 

 

반응형
Posted by newind2000
Busan IT/제어기초2015. 2. 4. 17:35

LEGO - Mindstorm

 

펌웨어를 짤 때 프로그램의 구조를 이해하는데 도움이 되기에 Mindstorm으로 실습한다.

 

1. Sound를 활용한 간단한 멜로디 만들기

 

2. Ultrasonic 센서를 활용하여 거리 차에 따라 다른 소리/문자 출력하기

 

3. 거리 측정기 만들기

반응형

'Busan IT > 제어기초' 카테고리의 다른 글

LEGO - Mindstorm #3  (0) 2015.02.06
LEGO - Mindstorm #2  (0) 2015.02.05
ADC와 Lego Mindstorm  (0) 2015.02.03
마이크로 컴퓨터와 ADC & DAC  (0) 2015.02.02
마이크로 컨트롤러와 프로그램  (0) 2015.01.30
Posted by newind2000
Busan IT/제어언어2015. 2. 4. 17:35


20150204 - 포인터 변수의 기초.hwp

포인터 변수의 기초

 

학습목표 - 포인터의 개념을 이해하고 심볼 테이블을 만들 수 있다.

 

#1. Pointer - Randomized Base Address

 

보안이 강화되어 DOS에서 주소 값 출력을 요구하면 해당 주소의 값은 지속적으로 바뀌는 현상을 보였다.

 

지난 시간에 Visual Studio에서 Randomized Base Address의 설정을 해지하면 Memory에서 address가 고정되어 나타남을 확인할 수 있다.

 

실습) Visual Studio에서 Randomized Base Address의 설정을 해지한 후 주소 값을 확인해 본다.

 






 


#2. Address값의 직접입력 실습

 

#include <stdio.h>

 

int main()

 

{

int iNum = 100;

 

printf("iNum의값:%d\n", iNum);

printf("iNum의주소:%08X\n", &iNum);

printf("iNum의주소:%p\n", &iNum);

 

return 0;

}

 

위에 과정에 대한 CPUMemory의 처리과정을 설명하면,

1. CPU에서 변수형 int 변수명 iNum 100 선언

2. 메모리에서 해당 변수형, 변수명, 변수값을 메모리에 등록

//단 변수명은 문자임으로 해당 변수가 저장된 메모리의 위치를 숫자로 표현

3. CPU에서 해당 변수의 값과 주소를 불러달라고 요청하면 컴파일러가 이를 해석하여 저장되어 있던 iNum의 주소와 값을 불러온다.

 

인간이 기계가 쓰는 2진수 체계의 언어를 이해하고 구사하기 힘들기 때문에 그 중간역할을 하는 중간언어를 만들어 인간이 기계에게 특수한 과제를 실행하도록 프로그램을 짤 수 있게 만들어 놓았다

//중간언어를 기계어로 번역하기 위해 중간프로그램이 필요하다.

 

변수 iNum는 인간의 인식을 위한 문자이고 실제로 변수는 숫자형태의 주소로 메모리에 저장된다.

 

주소 0012FF28(16진수)10진수 1,244,968이다. 이것을 표현하면 0012FF28=1,244,968인데 이것은 오류를 일으킨다. ‘=’의 명령어는 오른쪽에 있는 것을 왼쪽에 넣는 명령어인데 왼쪽에 위치한 값은 항상 변수이어야 한다.

//오른쪽에는 변수든 상수든 올 수 있다.

 

실습) 변수명 대신에 주소, 1244968을 넣고 변수 값 50을 넣어보자.

 

//연산을 위해 몇 개의 항이 필요한지에 따라 단항 연산자, 다항 연산자로 구분된다.

//사칙연산은 다항 연산자이고, 단순 부호(+/-)는 단항 연산자이다.

//C에서 숫자 앞이나 변수 앞에 ‘*’를 붙이면 주소로 취급된다.

//형식은 (‘변수형’ *)(‘주소’) = ‘변수 값으로 된다.

 

#include <stdio.h>

 

int main()

 

{

int iNum = 100;

 

 

printf("iNum의값:%d\n", iNum);

printf("iNum의주소:%08X\n", &iNum);

printf("iNum의주소:%p\n", &iNum);

 

(int *)(1244968) = 50;

printf("iNum의값:%d\n", iNum);

//(int *)

return 0;

}

 

 

 

#3.

 

포인터의 사용 방법을 지난 시간에 배웠다.

 

실습) 포인터를 사용하여 iNum의 값을 불러와 보자.

 

#include <stdio.h>

 

int main()

 

{

int iNum=100;

 

 

printf("iNum의값:%d\n", iNum);

printf("iNum의주소:%08X\n", &iNum);

printf("iNum의주소:%p\n", &iNum);

 

 

//iNum = 50;

*((int *)(1244968)) = 50;

printf("iNum의값:%d\n", iNum);

 

return 0;

}

 

* 는 주소의 값을 선언하는 변수



실습) int iNum의 값을 99로 설정하고 값과 주소를 출력해 본다.




 

 

 

포인터 변수(Pointer type)

 

메모리의 공간주소를 가리키는 변수를 말한다. 포인터 변수는 주소를 담는 변수이다.

 

자료형마다 포인트 타입이 다 따로 있다.

//왜 자료형마다 포인터의 타입이 따로 있을까? 변수형이 부여하는 byte수의 차이 때문일까?

 

int *int형의 포인터 변수이다.

#4.

 

실습) 인트 변수 iNum=99와 포인터 변수 iP를 설정하고 이것의 주소와 크기를 출력한다.

iP변수를 iNum의 주소로 설정한 후 iNum을 출력해본다.

 



 


<Symbol Table + value>

Style

Name

Address

Value

int

iNum

12FF28

99

int *

iP

12FF1C

12FF28

 

+@

iP주소(=iNum의 주소)77을 넣으면 실제로 77이 표시된다.

*iP = 77;

printf("iNum의값은[%d] 입니다.\n", iNum);

 

결과 값, iNum = 77

반응형
Posted by newind2000