'분류 전체보기'에 해당되는 글 741건

  1. 2016.04.11 C언어의 문자열
  2. 2016.04.04 조건문 예제 2
  3. 2016.04.04 콤마(,) 연산자
  4. 2016.04.04 sizeof 연산자
  5. 2016.03.28 1장 연습문제
  6. 2016.03.28 2.7 논리형(bool형)
  7. 2016.03.28 2.6 문자 상수
  8. 2016.03.28 2.5 실수 자료형과 실수 상수
  9. 2016.03.28 2.4 정수 자료형과 정수형 숫자 상수
  10. 2016.03.07 1.9 2진수와 16진수

5.6 C언어의 문자열    [doc]     [smts]

 C언어에서는 char형 배열로서 단어나 문장 같은 문자열(string)을 처리하는데 사용된다. 일반적인 배열과 다른 점은 문자열의 맨 마지막에는 ‘\0’문자가 들어가야 한다는 것이다. 이것은 널(null)문자라고 하며 ASCII 코드값은 0이다. 문자열의 끝에 널문자를 삽입하는 것은 문자열이 어디에서 끝나는지를 명시적으로 표시하기 위해서이다.


다음의 예제를 보자.


0503-01.c

#include <stdio.h>

int main(void) {

char str1[] = {'H', 'e', 'l', 'l', 'o', '\0'};//❶

char str2[] = "there"; //❷

printf("%s %s\n", str1, str2);

}


실행 결과 :

Hello there


위의 예제에서 ❶에서 보면 char형 배열을 초기화할 때 일반적인 배열의 초기화 방법에 따르고 있다. 이런 식으로 문자열을 초기화한다며 맨 마지막 요소로 널문자를 사용자가 명시적으로 첨가해야 한다.. 그리고 ❷를 보면 문자열을 초기화하는 두 번째 방법이 나와 있는데 그것은 큰따옴표로 단어나 문장을 묶는 것이다. 이 경우에는 맨 마지막의 널문자을 생략할 수 있는데 컴파일러가 자동으로 널문자를 삽입해 준다. 두 번째 방법이 훨씬 간결하기 때문에 문자열을 초기화할 때는 보통 이 방법을 쓴다.


 출력 함수인 printf()에서 문자열을 표시하는 제어문자는 %s이다. 이 제어문자를 만나면 해당 문자열을 널문자가 나올 때까지 화면에 표시하게 된다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

6.1 포인터 개요  (0) 2016.04.15
5장 연습문제  (0) 2016.04.11
조건문 예제 2  (0) 2016.04.04
콤마(,) 연산자  (0) 2016.04.04
sizeof 연산자  (0) 2016.04.04
Posted by 살레시오
,

4.1.2 조건문을 사용한 예제 2    [doc]    [smts]

전 절의 예제와 약간 다른 다음 문제를 풀어보도록 하겠다..


2. 세 개의 float 형 숫자를 사용자에게 입력 받아서 가운데 수를 출력하는 프로그램을 작성하라.


 이 문제는 앞의 문제보다는 한 번 더 생각해야 한다. 여기서도 세 float형 변수를  f1, f2, f3 라고 하고 결과값(중간 수)를 저장하는 변수를 fMid 라고 하고 임시값을 저장하는 변수명을 fTmp라고 하자. (Tmp는 temporary 를 줄인 단어임) 알고리듬은 다음과 같이 생각해 볼 수 있다.


(a) f1과 f2 중 작은 수를 fMid 에 저장하고 큰 수를 fTmp에 저장한다.

(b) f3가 fMid보다 크다면 현재 fMid 값이 최소값이라는 의미다. 따라서 f3와 fTmp중 작은 것이 중간값이므로 그것을 fMid에 저장한다.

(c) f3가 fMid 보다 작다면 (a)에서 구한 fMid 값이 중간값이다.

(d) fMid를 출력한다.


 이제 이 알고리듬을 프로그램으로 작성해 보면 다음과 같다.


ex04-07.c
#include  <stdio.h>
int main() {
float f1, f2, f3;
printf("Input three numbers : ");
scanf("%f,%f,%f", &f1, &f2, &f3);
float fMid, fTmp;
if (f1>f2) { // 알고리듬 (a)를 구현한 것임
fMid = f2;
fTmp = f1;
} else {
fMid = f1;
fTmp = f2;
}
if (f3 > fMid) // (b)를 구현한 것임
fMid = (f3>fTmp)? fTmp:f3;
printf("The middle value is %f.", fMid);
}


위에서 보면 알고리듬 (c)가 성립한다면 두 번째 if 문이 실행되지 않고 바로 printf()문이 실행이 되므로 올바르게 작동하는 것을 이해할 수 있을 것이다. 실행 예는 다음과 같다.


Input three numbers : -11,22.5,100.345
The middle value is 22.500000.

'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

5장 연습문제  (0) 2016.04.11
C언어의 문자열  (0) 2016.04.11
콤마(,) 연산자  (0) 2016.04.04
sizeof 연산자  (0) 2016.04.04
1장 연습문제  (0) 2016.03.28
Posted by 살레시오
,

3.11 콤마(,) 연산자    [doc]    [smts]

 콤마(.)도 C 언어의 연산자인데 피연산자 두 개를 받는 이항 연산자이다. 이 연산자는 첫 번째 식을 구한 다음 그것은 버린다. 그리고 두 번째 연산을 수행하여 그 결과값을 반환한다. 쉼표 연산자는 우선 순위가 가장 낮기 때문에 먼저 수행하려면 괄호를사용해야 한다. 예를 들어 보자.


0311-01.c
#include <stdio.h>
int main() {
   int ia=1, ib=2, ic, id, ie;

   ic = (ia, ib); //(a)
   id = ia, ib; //(b)
   ie = (ia, ib, ic); //(c)

   printf("ic:%d\n", ic);
   printf("id:%d\n", id);
   printf("ie:%d\n", ie);
}
실행 결과
ic:2
id:1
ie:2

위에서 (a)는 괄호안의 콤마연산자를 먼저 수행하므로 ib값을 반환하여 그것이 ic에 저장된다. (b)는 id에 ia값이 저장된다. 왜냐면 콤마 연산자는 대입연산자보다 우선 순위가 낮아서 다음과 같기 때문이다.


id = ia, ib; // (b)

(id = ia), ib;


따라서 id=ia 가 먼저 수행되고 ib값이 구해지지만 그 뒤에 아무 동작이 일어나지 않는다. (c)는 콤마 연산자의 결합 방향에 의해서 다음과 같다.


ie = ( ia, (ib, ic) );

따라서 ie에는 ic값이 저장된다.


 콤마 연산자는 두 개의 표현식을 하나로 줄일 때 주로 사용된다.


// 두 개의 표현식

ia++;

ib++;


//콤마 연산자를 이용한 하나의 표현식

ia++, ib++;


또한,  만약 두 개의 대입문을 하나로 줄이고 싶다면 다음과 같이 하면 되지만 이런 식으로는 잘 사용되지 않는다.


ia = 1;
ib = 2;

ib = (ia=1, 2);

콤마 연산자는 나중에 소개될 for문의 갱신식에서 여러개의 변수를 동시에 변경시킬 때 많이 사용된다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

C언어의 문자열  (0) 2016.04.11
조건문 예제 2  (0) 2016.04.04
sizeof 연산자  (0) 2016.04.04
1장 연습문제  (0) 2016.03.28
2.7 논리형(bool형)  (0) 2016.03.28
Posted by 살레시오
,

3.10 sizeof 연산자    [doc]    [smts]

 연산자 sizeof 은 한 개의 피연산자를 갖는 단항 연산자로서 데이터의 바이트 수를 정수로 구하는 기능을 한다. 다른 연산자가 대부분 특수한 기호로 되어 있는 반면 sizeof  연산자는 식별자의 모양을 가지고 있어서 함수나 매크로가 아닐까 오해하기 쉽지만 엄연히 기본 연산자이고 따라서 이것을 사용하기 위해서 어떠한 헤더 파일을 인클루드할 필요가 없다. 예를 들어 int 자료형의 바이트수를 구하고 싶다면 다음과 같이 하면 된다.


sizeof(int);

혹은 생성된 변수의 자료형도 구할 수 있다.


double da = 1.1;
int ia = sizeof(da);

이 연산자를 이용하면 뒤에 나올 enum, struct, union 같은 자료형의 바이트수도 쉽게 구할 수 있다.


0310-01.c

#include <stdio.h>
int main() {
   //자료형의 바이트수 구하기
   printf("int : %d bytes\n", sizeof(int));
   printf("long long : %d bytes\n", sizeof(long long));

   // 변수의 바이트 수 구하기
   long double lda = 0;
   long la = 11;
   printf("lda : %d bytes\n", sizeof(lda) );
   printf("la : %d bytes\n", sizeof(la) );
}

실행 결과

int : 4 bytes
long long : 8 bytes
lda : 16 bytes
la : 4 bytes

 sizeof 연산자는 메모리를 할당하는 malloc(), calloc() 함수와 같이 사용되어 할당될 메모리의 크기를 지정하는데 주로 사용된다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

조건문 예제 2  (0) 2016.04.04
콤마(,) 연산자  (0) 2016.04.04
1장 연습문제  (0) 2016.03.28
2.7 논리형(bool형)  (0) 2016.03.28
2.6 문자 상수  (0) 2016.03.28
Posted by 살레시오
,

연습문제    [DOC]    [SMTS]

  1. 화면에 자신의 학번과 영문 이름을 출력하는 프로그램을 작성하라.

  2. 화면에 다음과 같이 출력하는 프로그램을 작성하라


----------------------
1 2 3
one two three
uno due tre
---------------------

(3)  (110101.11)2를 10진수와 16진수로 변환하라.

(4) 십진수 625를 2진수와 16진수로 변환하라.

(5) 십진수 0.6825를 2진수로 변환하라.



'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

콤마(,) 연산자  (0) 2016.04.04
sizeof 연산자  (0) 2016.04.04
2.7 논리형(bool형)  (0) 2016.03.28
2.6 문자 상수  (0) 2016.03.28
2.5 실수 자료형과 실수 상수  (0) 2016.03.28
Posted by 살레시오
,

2.7 논리형 (bool 형)    [DOC]    [SMTS]

 논리형(bool type)은 진리값인 참/거짓을 표현하는 자료형을 의미한다. ANSI C에서는 부울형이 따로 지정되지 않았지만 C99에는 stdbool.h 헤더파일을 이용하여 bool형을 사용할 수 있다.


#include <stdbool.h>
bool ba = true;
bool bb = false;

참을 나타내는 true와 거짓을 나타내는 false 식별자는 내부적으로 각각 1과 0값으로 취급된다.


 C++에서는 boolean 형이 기본 자료형으로 제공된다. 따라서 별도의 헤더파일을 인클루드하지 않고 바로 부울형 변수를 정의하여 사용할 수 있다.



'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

sizeof 연산자  (0) 2016.04.04
1장 연습문제  (0) 2016.03.28
2.6 문자 상수  (0) 2016.03.28
2.5 실수 자료형과 실수 상수  (0) 2016.03.28
2.4 정수 자료형과 정수형 숫자 상수  (0) 2016.03.28
Posted by 살레시오
,

2.6 문자 상수    [DOC]    [SMTS]

 C/C++언어에서는 정수형 변수에 정수뿐만 아니라 문자를 저장할 수 있으며 특별히 char형과 int형은 문자를 저장하는 목적으로도 자주 사용된다. 문자상수는 작은 따옴표(‘’)를 이용하여 표현되며 예를 들면 ‘a’, ‘+’, ‘0’ 등이 있다. 문자상수는 아스키(ASCII)코드라는 고유의 상수값이 정해져 있는데 다음 표에 몇몇 문자상수와 아스키코드값을 수록하였다.


표 2.3.1 문자와 ASCII 코드

종류

문자와 ASCII 코드

숫자 (문자)

ASCII 코드

‘0’

48

‘1’

49

‘2’

50

‘9’

57

알파벳 대문자

ASCII 코드

‘A’

65

‘B’

66

‘C’

67

...

‘Z’

90

알파벳 소문자

ASCII 코드

‘a’

97

‘b’

98

‘c’

99

...

‘z’

122

특수문자

ASCII 코드

‘&’

38

‘*’

42

‘+’

43




char형은 크기가 1바이트이므로 부호 없는 unsigned char 변수인 경우 0부터 255까지의 작은 정수를 저장할 수 있으며 short형은 2바이트로 부호 없는 숫자의 경우 0부터 65,535까지 저장할 수 있다. 만약 char형 변에 문자상수, 예를 들어서 ‘a’가 저장되면 내부적으로는 97이라는 숫자가 저장된다는 것을 알아야 한다.


[표 2.3.2 ] 한 문자가 저장되는 비트 구조


bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

‘a’ (97)

0

1

1

0

0

0

0

1


부호가 있는 정수형 데이터는 음수를 2의 보수로 저장하기 때문에 저장범위가 char형은 –128 ~ +127이 되고 short형은 –32,768 ~ +32,767이 된다.


 다음 예를 컴파일한 후 실행해 보자.


ex02-03.c

#include <stdio.h>

int main() {
char ca = 'a', cb = 'A';
char cc = '0';

printf("'%c'\t'%c'\t'%c'\n", ca, cb, cc);
printf("%d\t%d\t%d\n", ca, cb, cc);
}

실행 결과

'a'     'A'     '0'
97      65      48

이것을 보면 문자 ‘a’는 내부적으로 97, ‘A’는 65, 그리고 문자 ‘0’은 48과 같다는 것을 알 수 있다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

1장 연습문제  (0) 2016.03.28
2.7 논리형(bool형)  (0) 2016.03.28
2.5 실수 자료형과 실수 상수  (0) 2016.03.28
2.4 정수 자료형과 정수형 숫자 상수  (0) 2016.03.28
1.9 2진수와 16진수  (0) 2016.03.07
Posted by 살레시오
,

2.5 실수 자료형과 실수 상수    [DOC]    [SMTS]

 실수형 상수는 0.001, 2.0, 3.14159와 같이 소수점이 있는 수이며 <표2.1.1>에서와 같이 float, double, long double형 변수에 저장할 수 있다. 실수형은 내부적으로 그 데이터를 저장하는 방식이 정수형과 전혀 다르며 유효 자리수와 오차가 존재할 수 있다.


 실수를 표현할 때는 0.1, -2,3 과 같은 보통의 10진 표기법 외에 지수적 표기법이라는 것이 있는데 예를 들면1.234567e5 와 같은 것이다. 이것은 과학적 표기인



를 표현한 것이다. 또 다른 예로 1.234567e-3 은



이다. 실수 상수는 소수점을 반드시 포함해야 하며 지수부는 생략할 수 있다. 예를 들면 다음과 같다.


123.5
123.0 또는 123.
0.123 또는 .123
123e2 는 실수 상수가 아니다. (소수점이 없음)
123.e2는 실수 상수임.

실수형 변수를 선언하고 초기화하는 코드의 예는 다음과 같다.


float fa = 3.14159;
double da = 314.159e-2, db = 123e-3;
long double lda = 10.0;
float fb = .001;
float fc = 123.;

 실수 자료형은 float형, double형, long double형이 있는데 float형보다 double형의 표현 범위뿐만 아니라 정밀도도 더 높다. (정수형은 예를 들어 short형 보다 long형이 표현 범위만 넓어지는 것과 대조적이다)


 실수 상수는 내부적으로 double형으로 저장되므로 8 byte 메모리가 소요된다. 만약 실수 상수를 float 형으로 명시적으로 지정하려면 숫자 뒤에 f/F 접미어를 붙이면 된다.


float fb = 2.34f;
float fa = 1.23e-4f;

하지만 이 경우에도 자동으로 형 변환이 일어나므로 궂이 f/F 접미어를 붙여줄 필요는 없다.


 이와 같이 변수에 숫자상수를 대입할 경우에는 묵시적으로 형변환이 일어나기 때문에 사용자는 특별한 경우를 제외하고는 신경을 쓸 필요가 없다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

2.7 논리형(bool형)  (0) 2016.03.28
2.6 문자 상수  (0) 2016.03.28
2.4 정수 자료형과 정수형 숫자 상수  (0) 2016.03.28
1.9 2진수와 16진수  (0) 2016.03.07
1.8 atom 설치 / 첫 프로그램 실행하기  (2) 2016.03.07
Posted by 살레시오
,

2.4 정수 자료형과 숫자 상수    [DOC]    [SMTS]

 표 2.1.1에서 분류한 것과 같이 정수형은 크게 다섯 가지(char, short, int, long, long long)의 자료형이 있으며 바이트 수가 클수록 숫자 데이터의 범위도 커지게 된다. 정수형 변수에는 정수형 상수를 저장할 수 있으며 소수점이 없는 숫자는 정수형 상수이다.


 예를 들어 부호가 있는 int 형 변수 ia 를 숫자 0으로 초기화하려면 다음과 같이 하면 된다.


int ia = 0;

이후에는 ia라는 int형 변수를 '사용'하여 정수 값을 저장하거나 산술 연산을 수행할 수 있다.


int ia = 0;
ia = 12 * 34; // *는 곱셈 연산자임

 C언어에서 정수를 표현할 때 0으로 시작되는숫자는 8진수이고, 0x로 시작하는 숫자는 16진수라는 것이다. 예를 들어서 123은 그냥 10진수 123이지만 0123 이라고 입력하면 8진수 123이기 때문에 10진수로 변환하면 83이다. 그리고 0x123은 16진수 123이기 때문에 10진수로 변환하면 291이 된다. 이것을 다음 표에 정리하였다.


[표 2.2.1] 숫자상수의 접두어 예

숫자 상수

십진수값

비고

123

123

10진수

0123

83

8진수

0x123

291

16진수

0b1110

14

2진수 (gcc에서 지원, C++14)


0123의 경우 십진수 123이라고 오해하기 쉬운데 0으로 시작하는 수는 8진수로 간주된다는 사실을 유의해야 한다.


 다음 예를 실행시켜보자.


ex02-02.c

#include <stdio.h>

int main() {
char ca = 123;
unsigned int uia = 0123;
long la = 0x123;

printf("%d, %d, %d", ca, uia, la);
}

실행 결과

123, 83, 291

이 결과로부터 8진수 123은 십진수 83이고 16진수 123은 십진수 291과 같다는 사실을 알 수 있다.

 정수형 상수는 기본적으로 int형으로 간주되므로 내부적으로 저장하는데 4 byte(혹은 2 byte)가 소요가 된다. 만약 숫자 상수를 특정한 자료형으로 지정해 주고 싶다면 접미어를 붙여서 그 데이터형을 지정할 수 있는데 U(혹은 u)를 붙이면 unsigned int형이고 l(혹은 L)은 long형, ul(혹은 UL)은 unsigned long형임을 나타낸다.


표 2.2.2 숫자상수의 자료형을 지정하는 접미어들

접미어

자료형

예제

u/U

unsigned int

37u, 123U
l/L

long

12l, 12L
ul/UL

unsigned long

89ul, 89UL

예를 들면 다음과 같다.


unsigned int uia = 0u;
unsigned long ula = 123ul;

하지만 보통은 숫자 상수는 대입하려는 변수의 자료형에 자동으로 변환되어 저장되므로 굳이 이렇게 일일이 자료형에 맞추어 접미어를 붙여줄 필요는 없다. 즉,


unsigned long ula = 123;

이라고 초기화하여도 123이라는 int형 상수는 자동으로 unsigned long 형으로 변환된 후 변수 ula에 저장된다.


 만약 숫자상수를 short 형이나 unsigned char 형으로 지정하고 싶다면 다음과 같이 해야 한다.


short sa = (short)1;
unsigned char uca = (unsigned char)123;

이와 같이 숫자 상수 앞에 (자료형)을 붙여 자료형을 강제로 변환하는 것을 형변환(casting)이라고 한다. 하지만 이 경우도 아래와 같이 할 수 있다.


short sa = 1;
unsigned char uca = 123;

이렇게 해도 자동으로 형변환이 일어나기 때문에 문제가 없다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

2.6 문자 상수  (0) 2016.03.28
2.5 실수 자료형과 실수 상수  (0) 2016.03.28
1.9 2진수와 16진수  (0) 2016.03.07
1.8 atom 설치 / 첫 프로그램 실행하기  (2) 2016.03.07
1.7 windows에서 mingw 설치하기  (0) 2016.03.07
Posted by 살레시오
,

1.9 2진수와 16진수    [DOC]    [SMTS]

1.9.1 2진수

   디지털 시스템에서 자료(data)는 모두 2진수로 저장된다. 2진수 시스템은 두수 (0,1)를 갖는 기수 2 시스템이다. 11010.11과 같은 2진수는 1과 0의 열과 2진 소수점으로 표현된다. 2진수와 같은 값을 갖는 10진수는 기수 2를 갖는 거듭제곱 수의 나열로 숫자를 확장해서 찾을 수 있다.  예를 들면 다음과 같다.


비트가 0일 때는 10진수로 변환하는 합에 영향을 미치지 않는다. 그러므로 10진수로의 변환은 비트가 1인 2의 거듭제곱수의 합으로 얻을 수 있다. 예를 들면 다음과 같다.


1.9.2 16진수

 16진수를 사용하여 2진수를 더 간결하게 표현하는 것이 길이가 4배 더 긴 2진으로 된 비트열을 사용하는 것보다 훨씬 편리하다. 그러므로 디지털 시스템에서는 2진수를 기술하기 위해 16진수를 많이 사용한다.


 16진수는 15까지 한자리로 표현되고 16이 되면 두 자리로 넘어간다. 따라서 10진 시스템에서 가져온 10개의 숫자와 10, 11, 12, 13, 14, 15를 하나의 숫자로 표현하기 위해 사용되는 문자 A, B, C, D, E, F를 갖는 기수 16 시스템이다. 16진수에 대한 예는 다음과 같다.


다음 표에 16진수 0부터 15까지를 2진수와 8진수로 표현한 것을 기술하였다.


[표 1.12.2]  

10진수

2진수

8진수

16진수

00

0000

00

0

01

0001

01

1

02

0010

02

2

03

0011

03

3

04

0100

04

4

05

0101

05

5

06

0110

06

6

07

0111

07

7

08

1000

10

8

09

1001

11

9

10

1010

12

A

11

1011

13

B

12

1100

14

C

13

1101

15

D

14

1110

16

E

15

1111

17

F


이중에서 2진수와 16진수와의 관계는 눈여겨 보아야 한다. 2진에서 16진수로의 변환은 2진 숫자를 소수점부터 시작하여 왼쪽과 오른쪽으로 4비트씩 나눔으로서 쉽게 얻어진다.

1.9.3 10진수로의 변환

 10진수에서 2진수로 변환하는 편리한 방법은 주어진 10진수를 반복해서 2로 나누어서 그때마다 나머지를 써두고, 그 몫을 다시 2로 나누는 방법을 몫이 0이 될 때까지 반복한 후 아래에서부터 위로 나머지를 읽어가는 방법이다. 예를 들어 10진수 103을 2진수로 변환하면 다음과 같다.


103/2

=51 +나머지 1

(LSD)

󰀵

51/2

=25 +나머지 1

25/2

=12 +나머지 1

12/2

= 6 +나머지 0

6/2

= 3 +나머지 0

3/2

= 1 +나머지 1

1/2

= 0 +나머지 1

(MSD)


따라서 (103)10=(1100111)2 가 된다.


 이번에는 (0.125)10 처럼 10진수의 소수값을 2진수로 변환시키는 방법을 알아보자. 주어진 소수값에 2를 곱한다음 그 결과값이 1을 넘으면 1을 써두고 1을 넘지 않으면 0을 써둔 다음 그 너머지 소수값에 다시 2를 곱한다. 이것을 소수값이 없어질 때까지 반복한 다음, 써둔 결과를 위에서 부터 읽어 내려간다. 즉,


0.125×2

=0.25 …정수값 0

(MSD)

0.25×2

=0.5 … 정수값 0

0.5×2

=1.0 … 정수값 1

(LSD)

󰀶


따라서 (0.125)10=(0.001)2이다.


 10진수에서 8진수 혹은 16진수로의 변환도 8 혹은 16으로 나누고 곱한다는 것만 빼고 위와 동일하게 얻어진다.

1.9.4 보수 (선택 사항)

 디지털시스템(digital system)에서는 음수를 표현하기 위해서 2의 보수(2‘s complement)를 사용한다. 1의 보수(1’s complement)는 0과 1을 서로 바꾸어서 얻을 수 있다. 즉 0→1, 1→0으로 변환하는 것이다. 예를 들어서

 n개의 자리수를 가진 2진수 N이 주어지면 2의 보수는 N≠0일 때 2n-N이고 N=0일 때 0으로 정의한다. 2의 보수는 1의 보수에 1을 더하여 얻을 수 있다. 예를 들어



또한 2의 보수는 최하위자리 0과 첫 번째 자리 1을 모두 변하지 않게 하고 다른 모든 상위자리 비트에 있는 1을 0으로, 0을 1로 바꾸어 만들 수 있다. 그래서 (1101100)2의 하위 자리수에 있는 2개의 0과 첫번째 1을 그대로 두고 다른 4개의 상위자리의 비트를 0을 1로 1을 0으로 바꾸어서 (0010100)2를 얻을 수 있다. 보수의 보수가 원래의 값을 갖는다는 것도 중요한 사실이다.

앞에서도 밝혔듯이 디지털 시스템에서는 2의 보수로서 음수를 표시한다. 예를 들어 8bit 숫자 체계에서 -10을 얻으려면 +10의 2의 보수를 구하면 된다. 즉 의 2의 보수인 이 -10이 되는 것이다. 이러한 개념은 감산 하드웨어를 간략하게 하는데 매우 유용하다.


[표 1.12.3] 8비트 수의 2의 보수

2진수

부호 없는 수

부호 있는 수

2의 보수

0000 0000

0

0

-

0000 0001

1

1

-

0000 0010

2

2

-

0000 0011

3

3

-

0111 1110

126

126

-

0111 1111

127

127

-

1000 0000

128

-128

1000 0000

1000 0001

129

-127

0111 1111

1000 0010

130

-126

0111 1110

1111 1101

253

-3

0000 0011

1111 1110

254

-2

0000 0010

1111 1111

255

-1

0000 0001


1.9.5 디지털 데이터 단위

 디지털 시스템에서 모든 데이터는 2진수로 표시된다. 2진수에서 각 자리의 수를 비트(bit)라고 하는데 이것이 디지털 데이터의 최소 단위이다. 2진 신호가 몇 개가 묶였느냐에 따라서 다음과 같이 구분한다.

  • 비트 (bit) : 0/1을 표시하는 최소 데이터 단위

  • 니블 (nibble) : 4 bits

  • 바이트 (byte) : 8 bits

  • 워드 (word) : 2 bytes = 16 bits

  • 더블 워드 (dword) : 2 words = 4 bytes = 32 bits


 다음 표에 220 까지의 십진수를 나열하였다. 이 중에서 210까지는 외우는 것이 앞으로 프로그래밍하는데 있어서 여러모로 편리하다.


[표 2.12.1] 2의 거듭제곱

n

2n

n

2n

0

1

1

2

11

2,048

2

4

12

4,096

3

8

13

8,192

4

16

14

16,384

5

32

15

32,768

6

64

16

65,536

7

128

17

131,072

8

256

18

262,144

9

512

19

524,288

10

1,024

20

1,048,576


또한 8자리 2진수의 최대값은 255, 16자리 2진수의 최대값은 65,535 라는 것도 알아두면 나중에 C언어 변수의 가용 범위를 계산할 때 유용하다.


 디지털 데이터의 용량을 표기할 때 물리적인 단위와는 다소 다르다.


  • 킬로(kilo) : 210 = 1,024

  • 메가(mega) : 220 = 1,048,576

  • 기가(giga) : 230 = 1,073,741,824

  • 테라(tera) : 240 = 1,099,511,627,776


예를 들어서

이다.


Posted by 살레시오
,