'STUDY/C 언어'에 해당되는 글 12건

  1. 2007.03.30 논리연산식의 표현방법
  2. 2007.03.17 연산자 3
  3. 2007.03.17 연산자 2
  4. 2007.03.16 연산자 1
  5. 2007.03.16 데이터형 구조
2007. 3. 30. 14:00

비트별 논리 연산자

 

&     AND (비트별 논리곱)

|       OR (비트별 논리합)

^      XOR (비트별 배타 논리합)

~      1의 보수

<<    왼쪽으로 시프트

>>    오른쪽으로 시프트

논리계산

 A

B

OR

AND

XOR

XNOR

 0

0

 0

 0

0

 1

 0

1

 1

 0

1

 0

 1

0

 1

 0

1

 0

 1

1

 1

 1

0

 1


AND(&) OR(|) 연산하고 논리연산 &&, || 하고 절대 착오없으시길 바랍니다.

논리연산은 참(1) 거짓(0)으로만 표현됩니다.

아래는 변수가 참, 거짓형으로 선언 되었을때의 논리연산방법 입니다.

AND A,BA && B로 표현되고,

OR A,BA || B로 표현되고,

NOT A!A 로 표현되고,

NOR A,B!(A || B)로 표현됩니다.

XOR A,B((!A)|| B) && (A|| (!B))라는 긴 문장을 써야 하고

(드 모르간의 법칙-ves ta de morgan-을 참조해 보시기 바랍니다. 논리 전자회로에서도 쓰므로 그 분야도 좋지요.)

XNOR A,B는 !((!A)|| B) && (A|| (!B))

또는 (A || B) && (!(A && B))라고 써도 됩니다.

 

'STUDY > C 언어' 카테고리의 다른 글

연산자 3  (0) 2007.03.17
연산자 2  (0) 2007.03.17
연산자 1  (0) 2007.03.16
데이터형 구조  (0) 2007.03.16
명령어 이해 - volatile  (0) 2007.03.09
Posted by Paul Hwang
2007. 3. 17. 09:47

a = 10 + b - 30 + (c + d);
위와 같은 문장이 있을때, = 를 기준으로 l-value(left value), r-value(right value)라 하며 l-value에는 수식이 올수 없으며 항상 변수가 오도록 규정되어져 있다. 여기서 =를 대입연산자라 하며 대입연산자는 l-value와 r-value를 갖는 대표적인 이항연산자이다. 또한 10 + b의 경우도 +는 10과 b라는 두개의 항을 갖는 이항연산자이다.

일항연산자 :    ~    *    ++    --
이항연산자 :    &    |    +    -    *    /    %
                    &&    ||    ==    >>    <<    +=    -=    *=    /=    ~=    &=    |=    >>=    <<=

삼항연산자 : ? :

이들을 다시 사용되는 분류상 나누어 보면 다음과 같다.

비트연산자 : & |
포인터관련연산자 : * &
전행,후행연산자 : ++ --
사칙연산자 : + - * /
나머지연산자 : %
쉬프트연산자 : >> <<
대입연산자 : += -= *= /= ~= &= |= >>= <<=
관계연산자 : && || ~ > < >= <= == !=

2.1 비트연산자

비트연산자는 and(&), or(|)의 비트 연산을 수행한다. 예를 들어 보겠다.

unsigned int a = 510,c;
unsigned int b = 0x0001;

c = a & b;

c에는 어떤 값이 대입될까? 결과는 0이다.

a = 0000 0001 1111 1110
b = 0000 0000 0000 0001

and ------------------

c = 0000 0000 0000 0000

보편적으로 and는 특정 비트의 값만을 추출하기 위해서 or는 특정비트를 1로 셋팅하기 위해서 많이 사용되며 and연산의 경우를 비트마스크라고 한다. 그래픽이나 하드웨어 제어시 사용된다.


2.2 포인트관련연산자

포인터는 C언어를 공부하는 모든 분들이 아주 어려워 하며 이곳에서 적절히 설명할 정도로 내용이 적지 못하다. 뒤에서 하나의 장으로 다시 설명하기로 하고 여기서는 연산자라는 입장에서만 생각해 보기로 하자.

int a = 10;
int *b;
b = &a;

printf("%x,%d,%d ",b,*b,a);

위 예에서 b라는 변수는 포인터변수로 선언되어 졌으므로 주소가 저장되어야 하므로

b = a;

와 같이 사용할수 없다. 값이 아닌 주소의 산출을 위해 &연산자를 사용하며 a라는 한개의 항을 갖는것을 볼수 있다. 간혹 비트연산자(and)와 혼동할수 있는데 항의 수로 구분하기 바란다.

printf()함수를 보면 b와 *b가 구분되어져 있는 것을 볼수 있다. b는 주소를 출력하며 해당 주소에 저장된 값을 보고자 할때는 *연산자를 사용하여 *b와 같이 표기해야 한다.


2.3 전행,후행연산자

전행연산자는 먼저 연산을 수행하여 결과를 저장하며, 후행연산자는 나중에 결과를 저장한다.

int a = 5;
a++;
--a;

a++와 같은 연산자를 후행연산자라고 하고 --a같은 연산자를 전행연산자라고 한다. 이들은 각각 아래와 같이 풀어서 생각해 볼수 있다.

int a = 5;
a = a + 1;
a = a - 1;

자~ 그럼 아래 예의 결과는 어떻게 될까?

int a = 5,b;
b = a++ + --a + ++a;
printf("%d ",b);

+ 연산자 두개를 기분으로 각각의 전행,후행연산자가 사용되었음을 볼수 있다. 항상 연산순위는 항이 낮은 것부터, 왼쪽에서 오른쪽순으로 수행된다. 이러한 기준으로 보면 가장 먼저 수행되는 항은 a++ 이다. 후행연산자 이므로 a는 5이지만 나중에 즉 printf()가 수행된 후에는 수치가 하나 증가하도록 예약되어 진다. 다음으로 --a는 전행연산자이므로 현재 a에 저장된 5란 값을 4로 감소시킨다. 다음으로 ++a는 전행연산자이므로 현재 저장된 4란 값을 1증가 시킨다.
이 값들을 모두 더하면 5 + 4 + 5 = 14가 된다. 그러나 printf()문을 수행하기전에 예약해 두었던 1이 증가하므로 사실상 b에는 15란 값이 저장되게 된다.
사실 위와 같은 예제는 시험에나 등장하는 예일 것이다. 실제로 작성할때는 이렇게 복잡하게 연산자를 사용하지도 않아야 한다. 여기서는 이해를 목적으로 하기에 설명한것 뿐이다.

'STUDY > C 언어' 카테고리의 다른 글

논리연산식의 표현방법  (0) 2007.03.30
연산자 2  (0) 2007.03.17
연산자 1  (0) 2007.03.16
데이터형 구조  (0) 2007.03.16
명령어 이해 - volatile  (0) 2007.03.09
Posted by Paul Hwang
2007. 3. 17. 09:21

1] 연산자의 우선 순위(int)
하나의 수식에 여러 개의 연산자가 있을 때는 우선 순위에 따라 연산이 실행된다.
연산자의 종류 순위 연산자 결합순서

1 기본 ( ), [ ], -> 좌에서 우로
2 단항연산자 !, -, ++, --, -(type), *, &, sizeof 우에서 좌로
3 산술연산자 *, /, +, - 좌에서 우로
4 이동연산자 >>, << 좌에서 우로
5 관계연산자 <, <=, >, >=, ==, != 좌에서 우로
6 비트연산자 &,^,| 좌에서 우로
7 논리연산자!, &&, || 좌에서 우로
8 복합배정연산자=, +=, -=, *=, /=, %=, |=, ^=, &=, >>=, <<= 우에서 좌로
9 콤마연산자 , 좌에서 우로

2] 산술연산자(int)
대상 변수, 상수, 함수간에 산술적인 처리를 지시하는 연산자(+, -, *, /)를 말한다.

1) 이항 연산자
두개의 데이터를 대상으로 산술적인 처리를 지시하는 연산자

ex) +, -, *, /, %
형식 : 변수 = 수식1 이항연산자 수식2
% : 나머지 계산 이항 연산자 x=b%c; b를 c로 나누어서 나머지를 x에 기억시킨다.

2) 단항 연산자
C언어에서만 존재하는 연산자로 1개의 데이터만을 대상으로 산술적인 처리를 수행하는 연산자

형식 : 단항연산자 수식1; 수식2 단항연산자;

연산자 기능 사용 수식
++ 1만큼 증가 a++; 또는 ++a; a=a+1;
-- 1만큼 감소 a--; 또는 --a; a=a-1;
- 부호를 바꿈 b=-a;

3) 할당 연산자 : 연산자 기능 사용 수식

= 우변의 값을 좌변에 기억한다. x=b;
+= 좌변에 우변을 더하여 그 결과를 좌변에 기억 x+=y; x=x+y;
-= 좌변에 우변을 뺀 다음 그 결과를 좌변에 기억 x-=y; x=x-y;
*= 좌변에 우변을 곱하여 그 결과를 좌변에 기억 x*=y; x=x*y;
/= 좌변에 우변을 나누어 그 결과를 좌변에 기억 x/=y; x=x/y;
%= 좌변에 우변을 나누어 나머지를 좌변에 기억 x%=y; x=x%y;

3] 논리연산자(logical operator)
복수 개의 조건을 동시에 결합하여 판정하고자 하는데 사용하는 연산자

형식 : 수식1 && 수식2;

연산자 기능 사용 설명
&& 논리곱(AND) x=y && z; 두개의 조건이 모두 참인 경우
|| 논리합(OR) x=y || z; 한개의 조건만 참인 경우
! 논리부정(NOT) x= !y; 현재 사실에 대한 부정의 경우

4] 관계연산자(Relational Operator)
두 데이터의 대소 관계, 동 관계 등을 비교하는 연산자 연산자 기능 복사식

> -보다 크다. x=(y>z);
< -보다 작다. x=(y<z);
>= -보다 크거나 같다. x=(y>=z);
<= -보다 작거나 같다. x=(y<=z);
== -와 같다. x=(y==z);
!= -와 같지 않다. x=(y!=z);

&&와 ||는 A && B, A || B라는 형식으로 쓰이는 이항연산자이지만 !는 !A라는 형식으로 쓰이는 단항연산자 입니다.
이항연산자는 항이 두개 필요한 것, 대표적으로 더하기, 빼기, 곱하기, 나누기 등이 있고, 단항연산자는 항이 하나만 필요한 것, 대표적으로 마이너스 부호 (빼기와는 다르죠?), NOT연산자 (!)등이 있습니다.

'STUDY > C 언어' 카테고리의 다른 글

논리연산식의 표현방법  (0) 2007.03.30
연산자 3  (0) 2007.03.17
연산자 1  (0) 2007.03.16
데이터형 구조  (0) 2007.03.16
명령어 이해 - volatile  (0) 2007.03.09
Posted by Paul Hwang
2007. 3. 16. 13:39

C언어는 키워드는 적어도 연산자 만큼은 그 그 어떤 언어보다도 많습니다.
그것이 C언어가 강력한 이유중 하나이죠.
C에서 연산자는 매우 중요하므로 잘 들으셔야 할 부분입니다.

(1) 기본 수학 연산자

우선 간단히 기본 수학 연산자를 하겠습니다.
C를 모르는 그 어떤 사람이라도 다 아는 것이니 머리 식힐겸 잘 읽어보세요.

기본 수학 연산에는 덧셈, 뺄셈, 곱셈, 나눗셈이 있습니다.
이에 따른 연산자는 다음과 같습니다.

------------- +   덧셈 -   뺄셈 *   곱셈 /   나눗셈 %   나머지-------------


나머지 구하는 연산자 빼면 누구나 다 아는 것이죠? 특별히 설명할것두 없겠네요.
c=a+b; 이렇게 하면 c에 a와 b를 더해 넣는 것이고
c=a-b; 이렇게 하면 c에 a에서 b를 빼 넣는 것이고
더 이상의 설명은 필요 없겠죠?

%는 사용법은 똑같으나 단지 나머지를 구하는 것 입니다.

(2) 단항 연산자

다음에는 단항 연산자를 알아보죠. 단항 연산자에는 +와 -가 있습니다.
단항 연산자는 변수나 상수앞에 붙여서 부호 표시를 하거나 부호를 바꿀때 쓰입니다.

예를 들어

a=-b; 이렇게 하면
a에는 b의 부호를 바꾼 값이 들어가겠죠?
만약 b가 -10이라면 a에는 10이 b가 10이라면 a에는 -10이 들어갑니다.
단항연산자중 +는 생략하면 기본으로 지정되므로 거의 쓰이지는 않습니다.

(3) 우선 순위

다음으로 연산자 우선순위를에 대해 알아보죠. 모든 연산자가 우선순위가 있다는 것은 알고 계시겠죠?
수학에서도 곱셈을 덧셈보다 먼저 하자나요. 그것은 곱셈의 우선순의가 높기 때문이죠.
아직 연산자를 많이 배우지는 않았지만 기본 수학 연산자의 우선순위를 알아보죠.

우선순위는 *, /, % 이 가장 높고 그 다음이 +, -입니다.
그리고 같은 순위에서는 왼쪽부터 계산이 됨니다.
또한 수식에 괄호가 있다면 괄호 안에 식을 먼져 계산하게 됨니다.

(4) 치환 연산자

우선 치환 연산자 입니다. 치환 연산자는 지금까지 계속 써 왔던 것 입니다.
치환 연산자는 바로 = 입니다. 이 연산자의 쓰임세는 아주 간단하죠? 모두들 알고계실 겁니다.

예를 들어
a=b; 이런 문장이 있다면 a에 b의 값을 넣으라는 것이 되겠죠?
이렇게 아주 간단합니다. 이렇게 지금까지 쓰던 문장을 단일 치환문 이라고 합니다.

그런데 C에서는 이런 단일 치환문 외에도 다중 치환문이 있습니다. 이것에 대해서도 자세히 알아보죠.
다중 치환문도 그리 어렵지 않은 것 입니다.

이 문장을 보세요.
a=b=c=d=e=f=1; 이렇게 한 문자에 치환 연산자가 2개 이상 쓰인 것을 다중 치환문 이라고 합니다.
이 문장의 결과는 어떻게 될까요? a,b,c,d,e,f모두에 1이 들어가겠죠?
치환 연산자는 +,-,*,/등의 연산자와는 다르게 오른쪽에서 왼쪽으로 연산을 수행합니다.

예를 들어..
e=a+b+c+d; 이건 a와 b를 더하고 그 값에 c를 더하는 식으로 왼쪽에서 오른쪽으로 연산을 수행하지만
a=b=c=d=e=f=1; 이건 f에 1을 넣고 e에 f의 값 즉 1을 넣고 하는 식으로 오른쪽에서 왼쪽으로 연산을 수행합니다.
위에 있는 다중 치한문 까지는 쉽게 이해가 되셨을 겁니다.

그럼 다음을 보세요.
a=10+(c=12-2); 이해가 빨리 되시나요?
어떻게 보면 잘못된 문장 같기도 하지만 이건 에러 없는 정확한 수식 입니다.

그럼 그 문장을 조금 바꿔 두 문장으로 해 보죠.
c=12-1;
a=10+c;
이제 이해가 되시나요??? 위의 수식을 줄여 쓴 것이 a=10+(c=12-2); 이거 입니다.
C에서는 이렇게 희귀한 수식도 인정합니다.

이제 예제 하나 볼까요??

/* 파일 이름     : C5-2.C   프로그램 내용 : 다중 치환문 예제 */
#include <stdio.h>
void main()
{
    int a,b,c,d,e,f;
   a=b=c=d=e=f=0;
   b=10;
   c=20;
   a=b+(d=c);
   printf("%d %d %d %d %d %d\n",a,b,c,d,e,f);
}


정말 간단한 소스죠. 조금 햇갈리실 것 이지만, 잘 분석하면 결과는..

C:\>C5-2.EXE30 10 20 20 0 0C:\>


이렇게 나옴니다.

(5) 타입 캐스팅

이제 치환 연산자도 다 끝났습니다.
그런데 배울것이 하나 더 있는데 그걸 배우기 전에 다음과 같은 경우를 생각해 봅시다.

만약 int형과 unsigned long형태를 같이 계산하면 어떻게 될까요?
자료형의 형태가 다르니 잘못하면 잘못된 결과가 나올수도 있습니다.
이럴때는 데이터 형태을 일시적으로 변경시켜 주면 되는데 이렇게 일시적으로 데이터 형태를 바꿔주는 것을 타입캐스팅(Typecasting) 이라고 합니다. C에서 타입캐스팅을 하려면 타입캐스팅 연산자를 사용해야 합니다.

그런데 타입캐스팅 연산자는 아주 간단합니다.
타입 형태 키워드들 즉 int, char, float등등이 타입캐스팅 연산자 기능까지 해 주기 때문이죠.
타입캐스팅 방법은 (타입)데이터 이렇게 하면 타입캐스팅이 됨니다.
여기서 타입은 바꿀 형태의 타입캐스팅 연산자 이고 데이터는 형태를 바꿀 데이터 인데 변수나 상수가 올수 있습니다. 또한 수식이 와도 상관 없습니다.

예를 들어보죠
int a=10;
unsigned long=b,c;
c=(unsigned long)a+b;

이 소스는 int형인 a를 unsigned long로 타입캐스팅 해서 unsigned long형태인 b와 더해 c에 넣는 것 입니다.
이제 이해가 되셨겠죠??

(6) 접미사

한가지 여기서 알고 넘어갈 것이 있는데 (사실 지금 설명할건 연산자와는 상관 없는 거지만....) 상수중 실재값은 정수의 경우 무조건 signed형태로 인식하고 int형태 범위 내에 값이면 int형으로 인식하며 그것을 벗어나면 long형으로 인식하게 됨니다. 그리고 소수의 경우는 무조건 double로 인식하죠, 그러므로 상수는 타입 캐스팅이 많이 필요합니다.

만약 123이란 상수가 있다고 합시다.
이건 int형태 범위 내에 있으므로 signed int로 인식됨니다.
그런데 이걸 unsigned long로 타입캐스팅 하려면 (unsigned long)123 이렇게 하면 됨니다.
하지만 이 방법보다 편한 방법이 있는데 123을 그냥 unsigned long형태로 인식시키는 것이죠.

그렇게 하기 위해선 접미사를 쓰면 됨니다.
접미사에는 L,F,U의 3가지가 있습니다. 그리고 대소문자 구별은 없습니다.
L은 long를, F는 float를, U는 unsigned를 의미 합니다.
그러므로 위에 것을 123UL 이렇게 서 주면 이 123은 unsigned long로 인식되어 타입 캐스팅이 필요가 없어 집니다.

'STUDY > C 언어' 카테고리의 다른 글

연산자 3  (0) 2007.03.17
연산자 2  (0) 2007.03.17
데이터형 구조  (0) 2007.03.16
명령어 이해 - volatile  (0) 2007.03.09
명령어 이해 - for 문  (0) 2007.03.07
Posted by Paul Hwang
2007. 3. 16. 13:25

정수 변수 -> int, unsigned int, short, unsigned short, long, unsigned long
실수 변수 -> float, double
문자 변수 -> char, unsigned char
문자열 변수 -> char(문자 변수와 표현형은 똑같다.)


sizeof()란 상수, 변수, 자료형의 byte 수를 알고자 할 때 사용하는 예약어이다.
크기를 생각해서 프로그래밍을할 때 사용하는 예약어이다.

sizeof(대상체);

숫자를 표현함에 있어서도 바이트 수를 다르게 할 수 있다.

12 -> 2Byte
12L -> 4Byte
12.4 -> 8Byte
12.4F -> 4Byte

이렇게 똑같은 숫자이지만 크기를 정하여 표현할 수도 있다.

sizeof('A'); 1바이트
sizeof("김"); 3바이트
sizeof("A"); 2바이트
sizeof('한');
sizeof('★');
sizeof('ㅁ');4바이트

sizeof 연산자는 피연산자의 크기를 계산하여 바이트 단위로 결과가 나오게 된다.
'A'는 char 타입으로, 대부분의 시스템에서는 1바이트가 나온다.

 
sizeof("김");은 char a[] = "김";과 같은 의미이다.
sizeof(a);는 3이다.
이때, a는 "김"이라는 문자열에서 널문자까지 포함하는 크기를 가지는 char 타입의 배열이 된다.

즉, 개수가 3개인 배열이 되는 것이다.그래서 sizeof(a)는 배열 a의 크기인 3이 나온다.

"A"는 널문자 포함 2개의 공간을 차지하므로 char 타입 2개의 배열이 생성되어 sizeof("A")는 결과로 2가 나온다.

'한'과 같은 것은 사실 잘못된 표현이다. 컴파일러는 '한'을 'AB'와 같은 의미로 해석한다. 이는 영문자는 한 글자에 1byte인데 비하여, 한글이나 특수 문자는 한글자에 2byte를 차지하기 때문이다.

작은 따옴표는 문자형 상수를 나타내는 기호로써, 작은 따옴표 안에는 하나의 문자만 포함해야 하는데, 두 개의 문자를 포함하는 것이 되어, 컴파일러는 억지로 작은 따옴표 안의 내용을 메모리에 자리잡게 하고 그 주소를 가져온다.

이때 sizeof('한')이라고 한다면 '한'이라는 글자가 저장되어 있는 주소의 크기가 되며, 이는 포인터 타입의 크기와 같다.

현재 대부분의 시스템에서 포인터는 4byte의 크기를 갖고 있다. 컴파일러에게 sizeof('한')은 sizeof('AA')와 같은 의미로 해석되며, 그 결과는 해당 문자들을 메모리에 자리잡게 한 후 자리잡은 위치를 가리키는 포인터의 크기이다.결론적으로, '한'과 같은 문자 상수 표현은 잘못된 것이다.

R/E/F/E/R/E/N/C/E/

---------------------------------------------------------------------------

Data Types (16-bit)

---------------------------------------------------------------------------

Type Length Range

---------------------------------------------------------------------------

unsigned char 8 bits(1)         0 to 255

char 8 bits(1)                     -128 to 127

enum 16 bits(2)                  -32,768 to 32,767

unsigned int 16 bits(2)          0 to 65,535

short int 16 bits(2)               -32,768 to 32,767

int 16 bits(2)                      -32,768 to 32,767

unsigned long 32 bits(4)       0 to

long 32 bits(4)                    -2,147,483,648 to 2,147,483,647

float 32 bits(4)                    3.4 x 10-38 to 3.4 x 10+38

double 64 bits(8)                 1.7 x 10-308 to 1.7 x 10+308

long double 80 bits(10)         3.4 x 10-4932 to 1.1 x 10+4932

near(pointer) 16 bits(2)         not applicable

far (pointer) 32 bits(4)         not applicable

---------------------------------------------------------------------------

Data Types (32-bit)

---------------------------------------------------------------------------

Type Length Range

---------------------------------------------------------------------------

unsigned char 8 bits(1)            0 to 255

char 8 bits(1)                        -128 to 127

short int 16 bits(2)                 -32,768 to 32,767

unsigned int 32 bits(2)             0 to 4,294,967,295

int 32 bits(2)                         -2,147,483,648 to 2,147,483,647

unsigned long 32 bits(2)           0 to 4,294,967,295

enum 16 bits(4)                     -2,147,483,648 to 2,147,483,647

long 32 bits(4)                      -2,147,483,648 to 2,147,483,647

float 32 bits(4)                       3.4 x 10-38 to 3.4 x 10+38

double 64 bits(8)                    1.7 x 10-308 to 1.7 x 10+308

long double 80 bits(10)            3.4 x 10-4932 to 1.1 x 10+4932

near(pointer) 32 bits(2)             not applicable

far (pointer) 32 bits(4)              not applicable

---------------------------------------------------------------------------

'STUDY > C 언어' 카테고리의 다른 글

연산자 2  (0) 2007.03.17
연산자 1  (0) 2007.03.16
명령어 이해 - volatile  (0) 2007.03.09
명령어 이해 - for 문  (0) 2007.03.07
명령어 이해 - #ifdef / #ifndef / #endif  (0) 2007.03.02
Posted by Paul Hwang