지금까지 다룬 type: int , float, _Bool(C99)

이번 장에서는 나머지 타입을 다룸.

7.1: integer -  long, short, unsinged

7.2: floating -  double, long double

7.3: 문자. char

7.4 같은 값의 다른 type으로 변환하기

7.5 typedef 이용해서 새로운 type을 정의

7.6 sizeof - 해당 type에 필요한 저장 공간


7.1 Integer Types


integer type - 정수형

floating type - 부동 소수점형


signed integer의 가장 왼쪽 bit는 수의 부호를 나타냄.

0: positive or zero

1: negative

따라서가장 큰 16비트 정수를 2진법으로 표현하면 

0111 1111 1111 1111 이다. (2^15-1)

가장 큰 16비트 unsigned integer는 

1111 1111 1111 1111 (2^16-1)


다음 6가지 형태가 short, long, signed, unsigned, int를 결합한 타입의 전부이다. 다른 표현 방법도 있으나 아래 있는 애들과 표기 방법만 다르고 동일한 type이다.

short int

unsigned short int

int

unsigned int

long int

unsigned long int


뒤에 오는 int는 생략 가능하다

short int -> short, unsigned long int -> unsigned long


32-bit CPU에서의 정수형 type의 최소값과 최대값(VS 2015는 32bit 기반이다)


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 

 long long int (C99)

 -9,223,372,036,854,775,808 

-(2^63) 

 9,223,372,036,854,775,807 
2^63-1 

 unsigned long long int (C99)

 0 

 18,446,744,073,709,551,615 
2^64-1 


C99에서는 long long int, unsigned long long int를 추가적으로 지원한다.


Integer Constants

정수를 10진수, 8진수, 16진수로 입력하는 방법

10진수 : 늘 하던대로, 0~9 사이의 숫자를 써서 입력

15 255 32767

8진수: 첫번째 숫자는 반드시 0, 나머지 숫자는 0~7 사이의 숫자를 입력

017 0377 07777

16진수: 0x로 시작하고, 0~9 사이의 숫자, a~f 사이의 문자(대문자여도 된다)를 써서 입력

0xff 0xfF 0xaF


가장 뒤에 L을 붙이면 long integer가 된다.

(C99) LL을 붙이면 long long

U를 붙이면 unsigned가 된다. 둘다 붙이면 순서는 상관이 없다.

ㄴ 소문자로 써도 된다.


Integer Overflow

integer 간 연산을 할 때, 결과가 type이 허용하는 범위를 벗어날 때 overflow가 발생했다고 한다.

signed integer에서 overflow가 발생했을 때에는 결과가 아무렇게나 나온다. (undefined)

unsigned integer에서 overflow가 발생하면 프로그램의 행동은 정의되어 있다(defined).

결과값 % 2^n (n은 결과값을 저장하는데 필요한 비트의 수)


Reading and Writing Integers

printf와 scanf 함수에서 format string 사용하기

%u    unsigned int (base 10)

%o    unsigned int (base 8)

%x    unsigned int (base 16)


short와 long을 표시하려면 h, l(영어 소문자)을 d, o, u, x 앞에 붙이면 된다.

%hd    short

%hu    unsigned short

%hx    unsigned short (base 16)

%ld     long

%lld    long long


7.2 Floating Types


 float

 Single-precision floating-point

 double                

 Double-precision floating-point

 long double

 Extended-precision floating-point

float - 정확도가 그리 중요하지 않은 경우(ex 소수점 첫째 자리까지 표시하는 온도)

double - 좀 더 정확하게 표현 가능하며 대부분의 프로그램에게 충분하다

long double - 매우 정확한 표현. 드물게 쓰인다.


Floating Type Characteristics(IEEE Standard)


 Type

Smallest Positive Value 

Largest Value 

Precision 

float 

1.17549e-038 

3.40282e+038 

6 digits 

double 

2.22507e-308 

1.79769e+308 

15 digits 


Floating Constants

floating constants는 다양한 방법으로 표현 가능하다. 아랫줄에 써져 있는 모든 표현은 57.0을 나타낸다.

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

C 컴파일러는 기본적으로 floating constant를 double 형식으로 저장한다.

뒤에 f나 l을 붙이면 float, 또는 long double로 저장한다(ex 57.0f 또는 57.0L)


Reading and Writing Floating-Point Numbers

double: e, f, g 앞에 소문자 l을 붙인다.

scanf("%lf", &d);

printf의 경우, l을 붙이지 않아도 된다. 그냥 %e, %f, %g가 float과 double에 모두 적용된다.


long double: e, f, g 앞에 L을 붙인다.

scanf("%Lf", &ld);

print("%Lf", ld);


7.3 Character Types


char type의 value는 사용하는 character set에 따라 컴퓨터마다 다를 수 있다. 

ASCII는 가장 보편적인 character set이며 이를 확장한 256문자 코드인 Latin-1이 있다.


문자 상수는 single quote(' ')로 묶인다. C는 문자를 작은 정수로 간주한다. 사용하는 문자열

ASCII에서 'A'는 65, 'a'는 97이다. 따라서 숫자처럼 문자끼리 비교할 수 있다.


소문자를 대문자로 변환하기

if ('a' <= ch && ch<= 'z')

ch = ch - 'a' + 'A';


Signed and Unsigned Characters

unsigned char는 -128부터 127까지의 값을, signed char는 0부터 255까지의 값을 가진다.

C standard에서는 char가 signed인지 unsigned인지 정해두지 않았고, 실제 사용할 때도 꼭 필요한 경우가 아니면 부호는 지정하지 않는 것이 좋다.


Arithmetic Types

integer types, floating types를 합쳐서 arithmetic types라고 한다.

C99에서 arithmetic type의 구분

-- Integer types

- char

- Signed integer types, both standard (signed char, short int, int, long int, long long int) and extended

- Unsigned integer types, both standard (unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int, _Bool) and extended

Enumerated types

-- Floating types

- Real floating types (float, double, long double)

- Complex types (float_Complex, double_Complex, long double_Complex)


Escape Sequences (3.1에서 추가)


Name 

Escape Sequence 

Alert(bell) 

\a 

Backspace 

\b 

Form feed 

\f 

New line 

\n 

Carriage return 

\r 

Horizontal tab 

\t 

Vertical tab 

\v 

Backslash 

\\ 

Question mark 

\? 

Single quote 

\' 

 Double quote

\" 



Character-Handling Functions

ch = toupper(ch);    /* converts ch to upper case */

toupper 함수는 C library에서 제공하며, 사용하기 위해서는 #include <ctype.h>가 필요하다.


Reading and Writing Characters using scanf and printf

format string으로 %c를 사용한다.

scanf("%c", &ch);

printf("%c", ch);

scanf 함수는 white-space 문자를 생략하지 않기 때문에, 입력한 값에서 space를 생략하기 위해서는 format string안에 space를 넣어주어야 한다.

scanf(" %c", &ch);


Reading and writing Characters using getchar and putchar

getchar, putchar 함수는 하나의 글자를 읽고 쓰는 다른 방법이다.

getchar 함수가 한 번 호출될 때마다 하나의 글자를 읽는다. getchar가 리턴하는 변수의 형은 char가 아니고 int이다.

scanf, getchar와 마찬가지로, 이 둘은 white-space 문자를 스킵하지 않는다.

scnaf, getchar보다 더 빠르고, 다음과 같은 간단한 표현도 가능

while (getchar() != '\n');    /* skips rest of line */

while ((ch = getchar()) == ' ');    /* skips blanks */




+ Recent posts