2010. 7. 8. 18:39
7장 비트 단위 연산과 상수, 기본자료형

개발도구 : Dec C++



& : 비트단위 연산 AND
          ex) a & b

 : 오른쪽 왼쪽 둘다 true 일때 1을 반환
   -> 1 & 1 일때만 1을 반환

ex) 0 & 1 ==> 0
     0 & 0 ==> 0
     1 & 1 ==> 1

EX) ========================================

#include <stdio.h>

int main()
{
    int a = 5;   // 0000 0101
    int b = 20;  // 0001 0100

    int c = a & b;

    printf("AND 연산결과 : %d \n", c); // 결과 4
    system("PAUSE");

    return 0;
}

| : 비트단위 연산 OR
   ex) a | b

 : 오른쪽 왼쪽 하나라도 true 일때 1을 반환
   -> 0 & 1 일때만 1을 반환

ex) 0 | 1 ==> 1
     0 | 0 ==> 0
     1 | 1 ==> 1

EX) ========================================

#include <stdio.h>

int main()
{
    int a = 5;   // 0000 0101
    int b = 20;  // 0001 0100

    int c = a | b;

    printf("OR 연산결과 : %d \n", c); // 결과 21
    system("PAUSE");

    return 0;
}


^ : 비트단위 연산 XOR
   ex) a ^ b

 : 두값이 서로 다를때 1을 반환
   -> 0 & 1 일때만 1을 반환

ex) 0 | 1 ==> 1
     0 | 0 ==> 0
     1 | 1 ==> 0

EX) ========================================

#include <stdio.h>

int main()
{
    int a = 5;   // 0000 0101
    int b = 20;  // 0001 0100

    int c = a ^ b ;

    printf("XOR 연산결과 : %d \n", c); // 결과 17
    system("PAUSE");

    return 0;
}

~ : 비트단위 연산 NOT
   ex) ~ a

 : 값을 반대로 나타낸다.
   -> 0은 1로, 1은 0으로 바뀐다.

ex) ~0  ==> 1
     ~1  ==> 0

EX) ========================================

#include <stdio.h>

int main()
{
    int a = 20;  // 0001 0100
   
    int c = ~a ; // 1110 1011

    printf("NOT 연산결과 : %d \n", c); // 결과 -21
    system("PAUSE");

    return 0;
}


<< : 비트단위 연산 왼쪽 쉬프트 연산

   ex)  a << b -> a의 비트들을 b칸씩 왼쪽으로 이동
         8 << 2 -> 8의 비트들을 왼쪽으로 2칸 이동

 : 8의 2인수 형태 : 0000 1000
   -> 1을 왼쪽으로 두칸 이동 : 0010 0000 ; 32

  ※ 부호비트 까지 밀려나기때문에 주의한다!

EX) ========================================


#include <stdio.h>

int main()
{
    int a = 8;


    int c = a << 2; // c = 32

    printf("%d의 << %d 만큼 비트연산한 결과 : %d \n", a, 2, c);
    system("PAUSE");

    return 0;
}

>> : 비트단위 연산 오른쪽 쉬프트 연산

   ex)  a >> b -> a의 비트들을 b칸씩 왼쪽으로 이동
         8 >> 2 -> 8의 비트들을 오른쪽으로 2칸 이동

#include <stdio.h>

int main()
{
    int a = -8;


    int c = a >> 2; // c = -2

    printf("%d의 >> %d 만큼 비트연산한 결과 : %d \n", a, 2, c);
    system("PAUSE");

    return 0;
}



자료형(data type) ; 자료를 나타내는 형(type)

 - 선언할 변수의 특징을 나타내는 문자(키워드)

 - 1. 정수냐? 실수냐?에 대해서 나타냄
   > 미리 선언을 하는것

 - 2. 메모리를 몇 byte 할당받아서 나타낼건지?
   > 저장할 데이타의 메모리공간 할당



기본자료형

 - 기본적으로 제공이 되는 자료형
    ex) int, float, double, long형



사용자 정의 자료형

 - 사용자가 정의하는 자료형

 - ex) 구조체, 공용체, 클래스(C++)



기본자료형의 종류

 char       1 byte   
 short      2 byte
 int        4 byte
 (64비트 운영체제 : 8byte)

 long       4 byte
 float
 double
 long doulbe



ANSI( 표준화된 문법제정) 99년도에 표준된 데이타표현

 - int가 4byte면 long은 4byte 이거나 그 이상이 되어야 함

 - 명확하지 않음 ;long(표준화되지 않았다고..)

 - long은 시스템에 따라 차이가 남(크기 : int <= long)
 
 - long double도 마찬가지로 인식을 한다.(long double >= double)



n비트로 표현할수 있는 데이타 수

 = 2(n승);
  ex) 1byte : 2(8승) = 256가지의 데이타 표현 -> char형



자료형이 다양한 이유? ;

 -=> 데이타 표현방식이 다르기때문
   - 정/실수형 데이타를 표현하는 방식

 -=> 메모리 공간을 적절히 사용하기 위해서



자료형 선택의 기준

 - 정수형 데이터를 처리하는 경우
  --> 컴은 int 형 연산을 가장 빠르게 한다.

ex) 1000의 수를 char 형에 넣지 못한다
     => char 형은 최대 256까지 표현가능
     => int 형이 적절(2의32승)


sizeof 연산자
 - 피연산자 메모리 크기를 반환
 
#include <stdio.h>

int main()
{
    int number = 5;
    printf("int 자료형의 크기 : %d \n", sizeof(number));
    printf("sizeof(int) ; %d \n", sizeof(int));
   
    system("PAUSE");
    return 0;
}

// 자료형 이름 (int) 는 괄호를 꼭 해줘야 한다. sizeof( int )
// 자료형 변수이름은 '()'괄호 생략 가능
// 그냥 괄호사용하는게 헷갈리지 않고 좋다.



자료형 선택

 - 정수형 데이타를 처리하는 경우
 
 - int가 내부적으로 연산을 가장 빠르게 한다.(정수표현)

 - char형 : 문자를 표현하기위한 자료형

 - float 형 : 소수이하 6자리까지 오차없이 처리 가능

 - double 형 : 소수이하 15자리까지 오차없이 처리 가능
   -> 정밀도가 얼마나 유지되나?

 => double에 대한 정밀도를 추구함!!   float은 정밀도 낮음


#include <stdio.h>

int main()
{
    float byun;
    float area;

    printf("정삼각형의 변입력 : ");
    scanf("%f", &byun);

    area = (byun * byun)/2;
    printf("정삼각형 넓이 : %f \n", area);
   
    system("PAUSE");
    return 0;
}
 
★ 메모리나 속도도 중요하지만 코딩시,
   프로그램은 얼마나 읽기 쉽게 작성을 하느냐?
   얼마나 코드를 유연성있게 작성을 하는가?   ★

상수는 일반적으로 대문자로 나타내어준다(관례)
초기화는 선언과 동시에 무조건 해주어야한다.



unsinged 가 붙어서 달라지는 표현

 - 기본자료형앞에 unsinged 를 붙여주면  무조건 데이타가 양수가 된다.
   > 음수의 데이타표현 범위가 양수로 바뀌게 되
   > 양수의 데이타 표현을 기본자료형의 두배로 표현 가능

 - 하지만 데이타 크기 자체는 변함 잆다.
  ex) unsigned char;
      unsigned int ;

 - 단, 실수형 자료에는 적용 되지 않음.



ASCII 코드를 이용한 문자표현
 
 - 컴퓨터는 내부적인 시스템은 2진수만 인식

 - 컴퓨터 자체는 문자, 그림, 소리 자료를 숫자로 변환해서

 - 2진수로 변환시켜서 저장

ex) A : 65, B : 66 C : 67
  => 컴퓨터와 사람과의 약속(컴퓨터는 문자를 이해못함)
  => ASCII 코드(ANSI : 미국표준협회에 의해 정의)
  => 아스키코드표 참고하세요


ASCII코드 범위 : 0~127 이하
                    char 형 변수로 처리 가능!

문자의 표현 : (' ') 를 통해 표현
컴퓨터가 아스키코드값을 확인해서 문자를 숫자로 저장.

ex) char as = 'A';  // A 아스키 코드값 65
      char a = 'a'    // a 아스키 코드값 97 

#include <stdio.h>

int main()
{
    char A = 'A';
    char B = 'B';
    char C = 'C';
    char D = 68;

    printf("%d \n", A);
    printf("%d \n", B);
    printf("%d \n", C);
    printf("%d \n", D);
    printf("%c \n", D);
   
    system("PAUSE");
    return 0;
}             



리터럴(literal) 상수

 - 이름을 지니지 않는 상수
   ex) 일반숫자

int number = 1 + 2;

해석하자면...

 // 1과 2를 메모리상에 올리고
 // cpu가 메모리공간에 올라간, 1, 2를 불러들려 계산하고
 // 메모리공간에 등록한  number 에다가 연산결과를 저장한다.

char c = 'A'        // 문자상수
int  in = 10         // 정수상수
double  dou = 3.14; // 실수상수

float f = 3.14 // float f = 3.14f

3.14는 double 형(8byte)
float(4바이트) <= (8byte) // 메모리 손실 가능성

접미사를 이용한 상수의 표현
unsinged int
long
....



심볼릭(Symblic) 상수 ; 이름을 지니는 상수

const 를 이용한 상수화

ex) cosnt int MIN = 200; // const 키워드 사용
    MIN = 100; // 불가

    const in MAX;  // 변수자체가 쓰레기 값으로 초기화
    MAX = 100; // 불가


Posted by 토실토실천재
2010. 7. 8. 18:38
준비물 : 필기도구, 연습장
 
 
 scanf 함수의 이해 <----> printf함수

 - 데이타를 입력받을때...
 
 - 10진수 정수형태를 입력해서 2번째 인자에 저장한다.
 
 - 배열, 포인터를 알아야 정확히 알수 있음.
 
 - 사용자가 직접 키보드를 이용해서 입력한 값을 변수에 대입을 하는것
 
 - scanf 함수를 이용한 정수의 입력
 
 - 변수의 주소값을 %d로 넘겨라
   > ex) 주소가 10번지면 %d는 10번지의 주소값이 들어간다
 
 
int main()
{
 int num;
 scanf("%d", &num) ;
 .....
 system("PAUSE");
 return 0;
}

                      
scanf("%d", &val);  //10진수 정수형으로 입력 받아서  변수 val에 저장하라
 
 

예제. 1) ======================================================



 
 
예제. 2) ==================================================
#include <stdio.h>
int main(void)
{
 int result;
 int num1, num2;
 printf("숫자 두개를 입력하세요 : ");
 scanf("%d %d", &num1, &num2);
 result = num1+num2;
 printf("%d + %d = %d \n", num1, num2, result);
 return 0;
}
=========================================================
 
scanf("%d %d %d \n", a, b);// 실행은 되지만 에러발생
                                                 // 메모리 참조 오류
 
 

● C언어의 키워드들
 
auto    _Bool   break case
char    int     do double
else    enum    float
while   void    sizeof
return  static  long ...... 등등
 
※ 키워드는 변수이름으로 사용불가하다!(예약된 언어다)
 
 
 

●  데이타 표현 방식의 이해
 
 - 컴퓨타가 데이타를 어떻게 표현을 할까?
 
 - 깊이 공부하기 위한 조건

진법에 대한 이해

 - n진수 표현 방식 : n개의 문자를 이용해서 데이타를 표현
   ex) 2, 8, 10 16진수

 - 컴퓨터는 내부적인 데이타 처리를 2진수로 처리
 
ex) 자리수 증가를 기준
 2 진수 : 0, 1
 8 진수 : 0 ~ 7
 10진수 : 0 ~ 9
 16진수 : 0 ~ 9, A ~ F 이용(a:10, b:11, c:12, ....f:15)
 
 

데이터의 표현 단위
 

1)bit(비트) : 데이타 표현의 최소단위, 2진수 값 하나
                 (0 또는 1)을 저장
 
2)byte(바이트) : 8bit == 1byte
 
이진수 ex)
.....128  64  32  16  8   4   2   1   0
 .....■  ■  ■  ■  ■  ■  ■  ■  ■
 
 

문제 3) ==========================================
 
 
 0 0 0 0 (0)
 0 0 0 1 (1)
 0 0 1 0 (2)
 0 1 0 0 (4)
 1 0 0 0 (8)

 
10진수 9를 2진수로 표현한다면?
 
10진수 43를 2진수로 표현한다면?
 
이진수 00010001 를 10진수 표현하면 얼마인가?

이진수 10011111 를 10진수 표현하면 얼마인가?
 
 
=====================================================
 
프로그램상의 8진수, 16진수 표현
 
 - 8진수 : 0으로 시작

 - 16진수 : 0x로 시작
 
int a = 10; // 10

int b = 0xa; // 16

int c = 012; // 10
 
 
 
예제. 3) ==================================================
 

 
#include <stdio.h>
 
int main()
{
 int a = 0xa7;
 int b = 0x43;
 int c = 032;
 int d = 024;
 printf("16진수 0xa7 : %d \n", a); // 17
 printf("16진수 0x43 : %d \n", b); // 7
 printf("8진수 032 : %d \n", c);  //
 printf("8진수 024 : %d \n", d);
 printf("a-b = %d \n", a-b);
 printf("c+b = %d \n", c+d);
 printf("b*c = %d \n", b*c);
 
 system("PAUSE");
 return 0;
}
// 컴퓨터의 모든 연산은 내부적으로 2진수로 한다.
 
 
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
정수와 실수의 표현 방식
 
  정수의 표현방식

 - MSB : 가장 왼쪽 비트, 부호를 표현

 - MSB를 제외한 나머지 비트 : 데이터의 크기 표현
 
1byte : 8bit
 

   <---데이타크기--->
■  ■  ■  ■  ■  ■  ■  ■

부호
비트
표현(+,-) (양수면 0음수면 1)
 
 
  00000001 (+1)
+ 10000001 (-1)
----------------
  10000010 (-2)     =>>> 이렇게 계산하면 오류이다
 
 
그럼 어떻게 할까?
 
※ 정확한 음의 정수 표현방식
 
1) 1의 보수를 취한다
  > 11111110
 
2) 1을 더한다
  > 11111111   ==>> -1의 2진형태
 
 
  00000001
+ 11111111
===========
 100000000  === 앞에 1은 무시되고 결국 '0'이된다.
 
☞ 2진수를 음수로 바꾸려면
   그 수의 1의 보수로 취해주고, 1을 더한다.
 
EX) 이진수 바꿈형태
    
    13 ÷ 2 ....1
     6  ÷ 2 ....0
     3  ÷ 2 ....1
              ....1
 
거꾸로 읽는다 : 1101 (13)
 
 
연습문제 : 10진수로 얼마 인가?
 
1) 0 1 0 0 1 1 1 1  [   ]
2) 0 1 1 0 0 1 1 1  [   ]
3) 1 1 0 1 0 1 1 0  [   ]
4) 1 1 1 1 0 0 0 0  [   ]
 
 
             
정수와 실수의 표현 방식
 
 - 컴퓨터는 실수보다 정수를 빠르게 처리한다.
 
 - 소수점이하의 작은 수가 생기면 한계를 지님
 
  Ex) -5.4 ?
      -5 + (-0,4) = -5.04
 
      근데 0.0001은 어떻게 나타낼까?
  - 오차가 존재하는 단점을 지님
 
  - ±(1.m)x2(e-127승)  <--- 부도소수점 표현방식

  ■ ■ ■ ■ ■ ■ ■ ■      ■ ■ ■ ■ ■ ■ ■ ■
  ↕  <---- m ------>      <------ e ------->
 부호
 비트
 
 0.0은 어떻게 표현할까?
 ===> 절대로 정확한 0.0에 가까운 값은 나타내지 못한다.
        부동수소점 오차 >> 모든컴퓨터는 이런식으로 표현
     
ex) 예제
 
   오차가 발생했다 -> 이걸 염두를 꼭 하기
     모든 프로그램밍 언어는 오차를 둘수 밖에 없다
   = 컴퓨터가 바보이기때문에

Posted by 토실토실천재
2010. 7. 8. 18:37

제 5장 변수와 연산자 - 2


 참고 : 개발툴 ( Dev C++)


  상수란?: 변경이 불가능한 수 // 변수와는 구분됨
 ex) 1, 2, 3...등등
 

 산술연산자와 대입연산자

 -  산술 연산자의 종류 
     ex) +, -, *, / , % 등이 있다 (더하기, 빼기, 곱하기, 나누기, 나머지 구하기)

===========================================

#include <stdio.h>
int main()

{
  int num1 = 10;                                                // 변수 선언동시에 10으로 초기화
  int num2 = 3;                                                 // 변수 선언동시에 3으로 초기화

  printf("두수의 더하기 : %d \n", num1 + num2); 
  printf("두수의 빼  기 : %d \n", num1 - num2);
  printf("두수의 곱하기 : %d \n", num1 * num2);
  printf("두수의 나누기 : %d \n", num1 / num2);
  printf("두수의 나머지 : %d \n", num1 % num2);
  
  system("PAUSE"); 
  return 0;
}
 
 



===========================================
 
기타 대입연산자

  - 대입연산자와 산술연산자가 합해져서 다양한 형태의 대입연산자 정의
   ex) +=, -=, *=, /=, %=

  ex) a = a+a;  ==   a+=a;
       a = a-a;  ==   a-=a;
       a = a*b;  ==   a*=b;
       a = a/b;  ==   a/=b;

==========================================

#include <stdio.h>

int main()
{
 
 int val1 = 3;
 int val2 = 4;
 int val3 = 5;

 val1 += 3;   // val1 = val1 + 3;
 val2 -= 4;   // val2 = val2 + 4;
 val3 *= 5;   // vla3 = val3 + 5;

 printf("rusult : %d %d %d \n", val1, val2, val3);

 system("PAUSE"); 
 return 0;
}

===========================================
 
 

다양한 연산자(수학적 지식??산수적 지식이란 같음)
 
부호 연산으로서 +, - 연산자

ex) -(+20) = -20
     -(-20) = +20

===========================================
 
#include <stdio.h>

int main()
{
 
 int number = 8;
 int number2 = -10;
 
 number1 = -number1;
 printf("number1 =  -number1 연산후 : %d \n", number1);
 
 number2 = -number2;
 printf("number2 =  -number2 연산후 : %d \n", number2);
 
 system("PAUSE"); 
 return 0;
}
 
 
===========================================

 증감감소연산자 

1. ++ : 증가 연산자(+1 증가)
2. -- : 감소 연산자(-1 감소)

ex) ++a : 1 먼저 증가 시킨후, 연산을 실행
     a-- : 먼저 연산 후, 감소시킨다.

===========================================


#include <stdio.h>

int main()
{
 int val1 = 10;              
 int val2 = (val1--)+2;            // (10--)+2 ==>> val2 = 12
 printf("val1 : %d \n", val1);   // val1 == 9
 printf("val2 : %d \n", val2);   // val2 = 12
 return 0;

}
 
 


#include <stdio.h>
int main()
{
   int a = 20;
   int b = 10;
 
   printf("a = %d \n", a);        // a = 20
   printf("b = %d \n", b);        // b = 10
 
   printf("a++ = %d \n", a++);  // a를 먼저 %d로(%d = 20) 그리고 난후 1 증가
   printf("++a = %d \n", ++a);  // a를 1증가 (a = 22) 그리고 난후 대입 

   printf("b-- = %d \n", b--); 
   printf("++b = %d \n", ++b);
 
  system("PAUSE");
  return 0;
}


 
 관계연산자(비교 연산자)

 - 논리적 참일때 : true(1);

 - 논리적 거짓일때 : false(0);

 - 사실은 컴퓨터는 0이 아닌값은 모두 true 라고 본다.
  ex) -1, -34, 45, 643 모두 true 다.


  

● 논리 연산자

 - and, or, not을 표현하는 연산자

 - true(1), false(0) 반환

1. && (and연산): 두 관계가 둘다 참일때 true 리턴 
2. || (or연산) : 두 관계중 하나라도 참일때 true 리턴
3. !(not 연산) : 이 연산의 참이면 false 리턴, 거짓이면 true 리턴


@ 연산자 우선순위로 실행되지만

- 우선은 우리가 알고 있는 수학적 연산순위와 크게 다를건 없다.



● 콤마 연산자

 - 둘이상의 변수 동시 선언

 - 둘 이상의 문장을 한줄에 선언 시

 - 함수의 매개변수 전달 시

 -연산자의 결합성
   ex) 1+4*3/2-6
       => +, - 보다는 *, / 연산이 먼저 실행이 된다.
       => 1+(4*3)(/2)-6; 
  


● 대입연산자 

int a, b, c;

a = b = c = 10;

printf("%d %d %d \n", a, b, c);



Posted by 토실토실천재