티스토리 뷰

C언어/K.N.King C PROGRAMMING

Chapter 7

소심야채 2020. 8. 27. 20:09

Basic Types

 

 

■ C에서는 근본적으로 다른 두가지 숫자 타입(정수 타입, 부동 소수점 타입)을 지원한다.

 

 

Singed and Unsigned Intergers

 

■ 부호있는 정수의 가장 왼쪽 비트 (부호 비트라고 함)는 숫자가 0이거나 양수이면 0이고 음수이면 1이다. 따라서 가장 큰 16비트 부호있는(signed) 정수는 0111 1111 1111 1111(2^15-1)이고 부호없는(unsigned) 정수는 1111 1111 1111 1111(2^16-1)이다. 둘의 차이점은 가장 왼쪽 비트(부호비트) 이다.

 

 

■ C에서 일반적으로 int는 32비트 이지만 오래된 CPU에서는 16비트 일 수도 있다.

 

 

Integer Types on a 16-bit Machine

Type Smallest Value Largest Value
short int -32,768 (-2^15) 32,767 (2^15-1)
unsigned short int 0 65,535 (2^16-1)
int -32,768 (-2^15) 32,767 (2^15-1)
unsigned int 0 65,535 (2^16-1)
long int -2,147,483,648 (-2^31) 2,147,483,647 (2^31-1)
unsigned long int 0 4,294,967,295 (2^32-1)

 

Integer Types on a 32-bit Machine

Type Smallest Value Largest Value
short int -32,768 (-2^15) 32,767 (2^15-1)
unsigned short int 0 65,535 (2^16-1)
int -2,147,483,648 (-2^31) 2,147,483,647 (2^31-1)
unsigned int 0 4,294,967,295 (2^32-1)
long int -2,147,483,648 (-2^31) 2,147,483,647 (2^31-1)
unsigned long int 0 4,294,967,295 (2^32-1)

 

Integer Types on a 64-bit Machine

Type Smallest Value Largest Value
short int -32,768 (-2^15) 32,767 (2^15-1)
unsigned short int 0 65,535 (2^16-1)
int -2,147,483,648 (-2^31) 2,147,483,647 (2^31-1)
unsigned int 0 4,294,967,295 (2^32-1)
long int -9,223,372,036,854,775,808(-2^63) 9,223,372,036,854,775,807 (2^63-1)
unsigned long int 0 18,446,744,073,709,551,615 (2^64-1)

■ 위 표의 표시된 범위는 C 표준에 의해 요구되지 않으며 컴파일러 마다 다를 수 있다. 특정 구현에 대한 정수 유형의 범위를 결정하는 한 가지 방법은 표준 라이브러리의 일부인 <limits.h> 헤더파일은 확인하는 것이다.

 

 

 

Integer Constants

 

■ C는 정수 상수를 10진수, 8진수 또는 16진수로 작성할 수 있도록 한다.

 

■ 10진수(Decimal) : 10진수 상수는 0에서 9사이의 숫자를 포함하지만 0으로 시작해서는 안된다.

ex) 15, 255, 32767

 

■ 8진수(Octal) :  8진수 상수는 0에서 7사이의 숫자만 포함하며 0으로 시작해야 한다.

ex) 017, 0377, 077777

 

■ 16진수(Hexadecimal) : 16진수 상수는 0에서 9사이의 숫자와 a와 f사이의 문자를 포함하며 항상 0x로 시작한다.

ex) 0xf, 0xff, 0x7fff

 

■ 컴파일러가 상수를 long integer로 처리하기 위해서는 뒤에 문자 L(또는 l)을 붙여야 한다.

ex) 15L, 0377L, 0x7fffL

 

■ 상수가 부호없다면 문자 U(또는 u)를 붙여야한다.

ex) 15U, 0377U, 0x7fffU

 

■ L과 U를 조합하여 쓸 수도 있다.(L과 U의 순서는 중요하지 않다.)

 

 

 

 

Floating Types

 

 

Floating Type Characteristics(IEEE Standard)

Type Smallest Postitive Value Largest Value Precision
float 1.17549 x 10^-38 3.40282 x 10^38 6 digits
double 2.22507 x 10^-308 1.79769 x 10^308 15 digits

■ 57.0을 표현하는 다양한 방법

  => 57.0    57.    57.0e0    57E0    5.7e1    5.7e+1    .57e2    570.e-1    

 

■ 기본적으로  부동 소수점 상수는 double-precision 숫자로 저장된다. 즉, C 컴파일러가 프로그램에서 상수 57.0을 찾으면 숫자가 double 변수와 동일한 형식으로 메모리에 저장되도록 배열한다. 이 규칙은 필요에 따라 double 값이 자동으로 float로 변환되기 때문에 일반적으로 문제가 되지 않는다.

 

 

Character Types

 

■ C는 문자를 작은 정수로 취급한다. 예를 들어 ASCII에서 문자 코드의 범위는 이진수 0000000에서 1111111까지이며 0에서 127까지의 정수로 생각할 수 있다.

 

■ 문자 상수로 사용되는 경우 이스케이프 시퀀스는 작은 따음표로 묶어야 한다. 예를들어, 이스케이프문자를 나타내는 상수는 '\33'(8진수) 또는 '\x1b'(16진수)로 기록된다. 이스케이프 시퀀스는 암호화된 경향이 있기 때문에 #define으로 이름을 지정해주는 것이 좋다.

 

 

Reading and Writing Characters using getchar and putchar

 

■ C는 문자를 읽고 쓰는 다양한 방법을 제공한다. 특히 scanf 및 printf를 호출하는 대신 getchar 및 putchar 함수를 사용할 수 있다.

 

■ getchar는 실제로 문자값아닌 정수를 반환한다. 결과적으로 변수가 getchar에서 읽은 문자를 저장하는 데 사용하는 경우 char 대신 int 타입을 갖는 것은 드문 일이 아니다. scanf와 마찬가지로 getchar는 공백 문자를 건너 뛰지 않는다.

 

Q.   Why getchar and putchar are faster than scanf and printf.

 

A_1) getchar와 putchar는 다양한 타입의 데이터를 읽고 쓰도록 설계된 scanf및 printf보다 훨씬 간단하다.

A_2) getchar와 putchar는 일반적으로 추가 속도를 위해 매크로로 구현된다.  

 

 

■ 부호있는 피연산자와 부호없는 피연산자과 혼합될경우 부호있는 피연산자가 부호없는 피연산자로 변하게 된다. 이 규칙은 모호한 프로그래밍 오류를 일으킬 수 있다.

 

 

Q&A

 

Q. 정수 i 가 음수일 경우 8진수 또는 16진수로 어떻게 출력 할수 있을까?

A. if( i < 0 ) printf("-%x", -i);   // 부호비트를 수의 일부라 생각하기때문에 예상치 못한 큰 값이 나올수있다.

   else printf("%x", i);

'C언어 > K.N.King C PROGRAMMING' 카테고리의 다른 글

Chapter 8  (0) 2020.09.01
Chapter 6  (0) 2020.08.26
Chapter 5  (0) 2020.08.25
Chapter 4  (0) 2020.08.24
Chapter 3  (0) 2020.08.20
댓글