지금까지 다룬 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 |
unsigned long long int (C99) | 0 | 18,446,744,073,709,551,615 |
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 */