2012년 9월 9일 일요일

자료형의 크기를 알려주는 연산자.

이번포스트에서는 크기를 알려주는 연산자 size of에 대해 알아보겠습니다.

근데 주의할 점이 대부분의 프로그래머들이 이 연산자의 피연산자를 소괄호에 넣어서 그런지 이 연산자를 함수로 오해하는 경우가 있다고 하네요.

절대 연산자입니다. 함수가 아닙니다.

양식
ex)
int main(void)
{
int tender = 1;
int size = sizeof(tender); // 변수 텐더의 크기를 계산해서 변수 size 초기화
int size1= sizeof(int);      // 자료형 int의 크기를 계산해서 변수 size1 초기화
//이하생략
}

양식은 이렇구요. 이번 실험엔 좀 다양하게 할껀데요. 전 포스트에 나오는 다양한 자료형 표 있죠? 여러가지 자료형 함수의 값을 알아보기 위해서 전 포스트 표에 나오는 함수들로 구성할것이니 모르시는분들은 보면서 하시길 바라겠습니다.


사용방법은 대충 이렇고요. 별 거 없습니다.

다만 저 값은 자료형의 크기이고, 이 크기는 다른 변수값이나 변수가 없어도 저 값이 나오게 할 수 있습니다. 어떻게 하면 될까요?

저는 처음에 어렵게 생각했습니다.

근데 생각하는것 보다 직접 해보는 게 답이 잘 풀리고 생각보다 쉽더라구요.

그렇습니다. 최댓값을 최솟값으로 그리고 변수 없이는 프린트함수에 sizeof(char) 이렇게 써넣으면 자료형의 사이즈 값이 나오더라구요.

그래서 굳이 최댓값 최솟값을 외울 필요는 없었습니다. ㅠㅠ

아무튼 포스트를 마치겠습니다.

기본 자료형 모음

자료형
크기
값의 범위
정수형
char
1바이트
-128x<127
short
2바이트
-32768x32767
int
4바이트
-2147483678x2147483647
long
4바이트
-2147483678x2147483647
long long
8바이트
-9223372036854115808x
9223372036854775807
실수형
float
4바이트
±3.4x10^-37x±3.4x10^38
double
8바이트
±1.7x10^-307x
±1.7x10^308
long double
8바이트
double이상의 표현범위

2012년 9월 8일 토요일

비트 연산자의 종류

이번 포스트에서는 비트 연산자들에 대해 알아보겠습니다.

& : 비트 단위로 AND(그리고) 연산을 한다.
ex) tender & tender2
 AND연산은 두 이진수의 자릿수가 1로 공통일경우 연산값은 1로중복되는 자릿수가 연산값이 됩니다.

쉽게 풀면 중1수학 집합 아시죠?

집합에서 교집합이라고 여기시면 되겠습니다.

그리고 이게 왜 and연산이냐면 그리고는 둘다 포함된다는 뜻이 있죠?

그래서 두 2진수의 자릿수가 똑같은것을 연상하시면 이해하기 쉬울겁니다.

| : 비트 단위로 or(또는) 연산을 한다.
ex) tender | tender2

OR연산은 둘 중 하나라는 말뜻이 있죠?

말 그대로 두 2진수중 하나라도 1이면 그 자릿수는 1이라는 겁니다.


^: 비트 단위로 XOR 연산을 한다.
ex) tender ^ tender2

이 연산은 보통 2진수의 계산이라 보시면 되겠습니다.

말 그대로 그냥 자릿수가 올라가지 않는 덧셈이라고 보시면 되겠습니다.


~ : 1을 0으로 0을 1로 바꿔주는 NOT 연산자입니다.
ex) ~tender

정말 쉬운 연산자입니다.
 다들 음의 정수를 2진수로 어떻게 표현하시는지는 아시죠?

모르신다면 간단하게 표현하겠습니다.

00000000 00000000 00000000 00000001 = 1
11111111 11111111 11111111 11111111 = -1
차이를 아시겠나요?

잘 모르시겠다면 다른 예를 가지겠습니다.

00000000 00000000 00000000 00000010 = 2
11111111 11111111 11111111 11111110 = -2

약간 눈치가 들어오시나요?

차이는 1과 0입니다.

한 2진수에 1의 보수를 취한 수에 1을 더한값이 -의 값이 되는 겁니다.

예를 들어봅시다.

000000101( = 5)

↓1의 보수를 취한다

111111010 

↓이 값에 1을 더한다.(1=00000001)

111111011 = -1

아까 2와 -2 1과 -1에 이 방법을 쓰시면 원하는 답을 얻으실 수 있을 겁니다.
자 길던 부가 설명은 건너가고 다음 연산자로 넘어갑니다.

<< : 이 연산자는 비트 열을 움직이는 기능을 가지고 있습니다.
ex) tender<<1 //비트 열을 왼쪽으로 1칸 옮긴다.

한마디로 00000001을 00000010로 바꿔준다는 겁니다. 값은 2


>> : 오른쪽으로 비트열을 옮겨주는 기능을 하는 연산자입니다.
ex) tender>>1 //비트열을 오른쪽으로 1칸 옮긴다.

여기까지 잘 따라오셨나요?
생각보다 그렇게 어렵진 않았습니다.(기본이라서 그런가요 ㅜ)
아무튼 시간이 너무 걸린 포스트였습니다.
여기서 마치겠습니다.

부동 소수점 오차(for 함수, float함수, double 함수)

이번 포스트에서는 부동 소수좀 오차를 알아갈 겁니다 .

들어가기전에 함수에 대해 알아봅시다.

일단 for 함수는 참일때까지 반복하는 함수입니다.

다들 수1에서 나오는 알고리즘을 연상했을 것이라 믿겠습니다.

그리고 쓰는 방법은

for(첫값; 끝값; 증가값;)

for(i=1; i>=10; i++)

이것은 알고리즘처럼 i가 1부터 10과 같거나 작을때까지 계속 1씩 더하는 것이다.

다음은 float 함수와 double 함수다. float는 4비트를 double은 8비트를 선언할 수 있으며 2배 차이기 때문에, 대부분에 사람들은 float함수가 필요 없다고들 합니다.

부동 소수좀 오차란 모든 프로그램에디터에 있는 오류로써 컴퓨터는 실수를 정확하게 표현을 못하고 근삿값에만 그치는 현상을 말하는 것입니다.

ex)
#include
int main(void)
{
int i;
double tender=0.0;

for(i=0; i<100; i++)
tender+=0.1//이 문장에서 텐더값을 0.1씩 100번더한다는 식입니다.

printf("0.1을 백번 더한 결과: %f \n", tender)//%f 는 10진수의 실수로 표현하라는 뜻입니다.
return 0;
}

결과

0.1을 백번 더한 결과: 10.100000

저 소수점이 바로 부동 소수점 오차이다.




8진수와 16진수를 이용한 데이터 표현

이번 포스트에선 8진수와 16진수의 선언방법에 대해서 공부할 것 입니다.

제일 기초적인 함수인 int 함수를 다들 아실겁니다.

대부분 int 변수=숫자; 이렇게 사용하는데요.

8진수와 16진수의 선언은 다릅니다.

int 변수 = 0xa 0x로 시작해서 바로뒤에16진수 숫자를 써놓으면 16진수를 10진수로 바뀌어서 프린트함수에서 10진수로 출력됩니다.※단 a는  16진수의숫자입니다.(10진수에서는 10)
int 변수 = 012 0으로 시작해서 바로뒤에 8진수 숫자를 써놓으면 8진수를 10진수로 바뀌어서 프린트함수에서 10진수로 출력됩니다.※단 12는 8진수의숫자입니다.(10진수에서는 10)


저렇게 선언을 하고 프린트함수안에 "%d",변수 이렇게 써주시면 출력으로 10진수로 입력한 변수가 16진수 또는 8진수로 바뀌어서 나타납니다.

ex)
#include <stdio.h>
int main(void)
{
int tender=0x10;
int tender1=04;

printf("0xf의 10진수의 값: %d \n",tender);
printf("04의 10진수의 값: %d \n", tender);

printf("%d + %d = %d \n", tender, tender1, tender+tender1);
printf("%d - %d = %d \n", tender, tender1, tender-tender1);
return 0;
}

출력값

0xf의 10진수의 값:16
04의 10진수의 값:4

tender + tender1 = 20
tender - tender1 = 12

매우 쉽습니다. ㅋ

2012년 9월 1일 토요일

scanf 함수

드디어 새로운 함수를 들어갑니다. 그것은 scanf라는 함수인데요.

이 함수는 빌드한 프로그램내에서 키보드로 문자를 기록할 수 있게 해주는 함수인데요.

저는 계산기처럼 사용해봤습니다. 우선 scanf함수의 사용법입니다.

ex)
include<stdio.h>

int main<void>
{
int tender1, tender2;
int result;

printf("정수를 입력해주세요.: ");
scanf("%d %d", &tender1, &tender2);

result=tender1+tender2;
prinf("계산한 값: %d", result);
return 0;
}

대충 이런데요. 설명을 붙인다면, scan함수는 앞에서 설명했듯이 수정가능한 부분을 제공하는 함수이기 때문에, 첫 번째 printf함수 맨 마지막부분에 문자를 찍어낼 수 있게 해줍니다. 대신 scanf함수의 정수 연산자 %d와 똑같은 배치 똑같은 갯수를 찍어내야만 두 번째 printf함수의 연산자 %d처럼 정상적으로, 그 결과가 찍어지게 됩니다.

아 그리고 주의할 점은 스캔함수의 괄호 밖에 변수앞에 &연산자 기호를 꼭 넣어야한다. 이유는 모르겠지만 안 그러면 입력이 안된다.

이렇게 말로만해서는 잘 모르니 준비한 자료와 영상으로 되새김질 해봅시다.


짤에서도 볼 수 있듯이, 스캔함수 변수앞에는 무조건 &기호가 있어야한다.

재차 강조하지만 프로그램에는 스캔함수 %d 연산자와 똑같은 배치 스캔함수안에 써져있는 %d 연산자의 갯수를 입력해야한다는 것.

이 것으로 스캔함수 포스트를 마친다.

p's: 난 처음에 이 프로그램을 돌릴 때, 무척이나 신기했다. 내가 드디어 내가 만든 프로그램에 내가 산 키보드로 내가 생각한 글자나 수를 입력할 수 있었다는 게 감동이었다.

연산자의 우선순위(서열)와 결합방향 모음집


순위
연산기호
연산자
결합방향
1
()
함수호출
()
[]
인덱스
->
간접지정
.
직접지정

변수++
변수--
후위 증가 및 감소
2

++변수
--변수
전위 증가 및 감소
()

sizeof


바이트 단위 크기 계산
~
비트 단위 NOT
!
논리 NOT
-, +
부호 연산(음수와 양수의 표현
&
주소 연산
*
간접지정 연산



3
(casting)
자료형 변환



4
* / %
곱셈, 나눗셈 관련 연산


5
+ -
덧셈, 뺼셈

6
<< >>
비트 이동

7
< > >= <=
대소비교

8
== !=
동등비교

9
&
비트 AND

10
^
비트 XOR

11
|
비트 OR

12
&&
논리 AND

13
||
논리 OR

14
? :
조건연산
15

= += -= *= /= %= <<= >>= &= ^= |=
대입연산

16
,
콤마연산


지금 본 표는 연산자의 서열과 결합방향 표이다.
여기서 서열이란 다항식에서 곱하기를 먼저하듯 계산하는 순서이고, 여기서 결합방향은 다항식에서 왼쪽에서부터 곱하기 나누기 먼저하고 더하기 빼기를 하듯이 왼쪽에서 오른쪽방향인 순서를 결합방향이라고 한다. 솔직히 결합방향은 이해가 가질 않는다. 또 연산자 명 행에 9위부터 13위를 보면 비트 AND 이런 것들이 나오는데 아직 필자가 공부한내용이 아니기때문에 나중에 배울꺼라 생각하고 쿨하게 넘어간다.