1ν•™λ…„ (2023)/C μ–Έμ–΄

[C] Study: λ³€μˆ˜μ™€ μžλ£Œν˜• - (3) μ •μˆ˜ν˜•

waterproof 2023. 8. 12. 19:06

 

 

 


[3] μ •μˆ˜ν˜•

 

 μ •μˆ˜ν˜•μ€ κ°€μž₯ 기본적인 μžλ£Œν˜•μœΌλ‘œ μ •μˆ˜λ₯Ό μ €μž₯ν•  수 μžˆλ‹€.

 

 μ •μˆ˜ν˜•μ—λŠ” λ‹€μŒκ³Ό 같은 μžλ£Œν˜•μ΄ μžˆλ‹€.

 

 

 μ •μˆ˜ν˜• λ³€μˆ˜λŠ” -∞μ—μ„œ +∞κΉŒμ§€ ν‘œν˜„ν•˜μ§€ λͺ»ν•¨

 

 λΉ„νŠΈμ˜ 개수 λ•Œλ¬Έμ— ν‘œν˜„ν•˜λŠ” 수의 λ²”μœ„μ— μ œν•œμ΄ μžˆλ‹€.

 

 shortν˜•: 16λΉ„νŠΈλ‘œ μ •μˆ˜ μ €μž₯

 

 int, longν˜•: 32λΉ„νŠΈ

 

 long longν˜•: 64λΉ„νŠΈ

 

μ°Έκ³ : λΉ„νŠΈμ™€ λ°”μ΄νŠΈ

μ»΄ν“¨ν„°μ—μ„œ μ‚¬μš©ν•˜λŠ” μ •λ³΄μ˜ μ΅œμ†Œλ‹¨μœ„λ₯Ό λΉ„νŠΈ(bit0라고 ν•œλ‹€. μ»΄ν“¨ν„°μ—μ„œλŠ” μ΄μ§„μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³  λΉ„νŠΈλŠ” μ΄μ§„μˆ˜μ˜ ν•˜λ‚˜μ˜ μžλ¦Ώμˆ˜κ°€ λ˜μ–΄ 0μ΄κ±°λ‚˜ 1일 수 μžˆλ‹€. 8개의 λΉ„νŠΈκ°€ λͺ¨μΈ 것이 λ°”μ΄νŠΈ(byte)이닀. λΉ„νŠΈλŠ” μ „μž μŠ€μœ„μΉ˜λ‘œ μ•„μ£Ό κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€. μ „κΈ°κ°€ 흐λ₯΄λ©΄ 1(on)이라고 μƒκ°ν•˜κ³  μ „κΈ°κ°€ 흐λ₯΄μ§€ μ•ŠμœΌλ©΄ 0(off)으둜 μƒκ°ν•˜λ©΄ λ˜λŠ” 것이닀.

 

μ°Έκ³ 

ν˜„μž¬ μžκΈ°κ°€ μ‚¬μš©ν•˜λŠ” μžλ£Œν˜•μ΄ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” λ²”μœ„κ°€ μ–Όλ§ˆμΈμ§€λ₯Ό μ•Œκ³  μ‹ΆμœΌλ©΄ limits.h 헀더 νŒŒμΌμ„ μ°Έκ³ ν•˜λ©΄ λœλ‹€. μ—¬κΈ°μ—λŠ” μ •μˆ˜ν˜•λ“€μ˜ μ΅œλŒ“κ°’κ³Ό μ΅œμ†Ÿκ°’μ„ 기호 μƒμˆ˜λ‘œ μ •μ˜ν•΄ λ†“μ•˜λ‹€. 예λ₯Ό λ“€μ–΄μ„œ intν˜•μ˜ μ΅œλŒ“κ°’μ€ INT_MAX둜, μ΅œμ†Ÿκ°’μ€ INT_MIN으둜 μ•Œ 수 μžˆλ‹€.

 

Q κ·Έλ ‡λ‹€λ©΄ λ‹€μ–‘ν•œ μ •μˆ˜ νƒ€μž… μ€‘μ—μ„œ μ–΄λ–€ μ •μˆ˜ νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬μ•Ό ν•˜λŠ”κ°€?
A λ§Œμ•½ μƒλ‹Ήνžˆ 큰 κ°’(32,767이상 λ˜λŠ” -32,767μ΄ν•˜)듀을 ν•„μš”λ‘œ ν•œλ‹€λ©΄ longν˜•μ„ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€. λ§Œμ•½ κΈ°μ–΅ 곡간을 쀄여야 ν•œλ‹€λ©΄ shortν˜•μ„ μ‚¬μš©ν•˜λŠ” 편이 μœ λ¦¬ν•˜λ‹€. 일반적인 κ²½μš°μ—λŠ” intν˜•μ„ μ‚¬μš©ν•œλ‹€. λ§Œμ•½ 음수λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ unsignedν˜•μ„ μ‚¬μš©ν•˜λŠ” 편이 μ’‹λ‹€.

 

 

 


unsigned μˆ˜μ‹μž

 unsignedλŠ” λ³€μˆ˜κ°€ μŒμˆ˜κ°€ μ•„λ‹Œ κ°’λ§Œμ„ λ‚˜νƒ€λ‚Έλ‹€λŠ” 것을 의미

 

 μŒμˆ˜κ°€ μ œμ™Έλ˜λ©΄ 같은 λΉ„νŠΈλ‘œ 더 넓은 λ²”μœ„μ˜ μ–‘μˆ˜λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.

 

 μ˜ˆλ₯Ό λ“€μ–΄

short -32768 ~ +32767
unsigned short 0 ~ 65535

 

unsignedλ₯Ό 뢙이면 μ–‘μˆ˜λ§Œ ν‘œν˜„ν•  수 μžˆλ‹€.

 

 λͺ‡ κ°€μ§€μ˜ 예λ₯Ό μ•„λž˜μ— λ³΄μ˜€λ‹€.

 

1
2
unsigned int speed; // λΆ€ν˜Έ μ—†λŠ” intν˜• λ³€μˆ˜ speed
unsigned speed;     // μ΄λ ‡κ²Œ ν•΄λ„ λœλ‹€.
cs

 

μ°Έκ³ 

unsigned라고만 μ“°λ©΄ unsigned intν˜•μ„ μ˜λ―Έν•œλ‹€. λ˜ν•œ shortν˜•μ€ short int라고 μ“Έ μˆ˜λ„ μžˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ longν˜•μ€
long int 라고 μ“Έ μˆ˜λ„ μžˆλ‹€.

 

 

 


μ˜€λ²„ν”Œλ‘œμš°

 

 μ •μˆ˜ν˜• λ³€μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ μ‚°μˆ  연산을 ν•˜λŠ” 경우, μ‚°μˆ  μ—°μ‚°μ˜ κ²°κ³Όκ°€ μ •μˆ˜ν˜•μ΄ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” λ²”μœ„λ₯Ό λ„˜μ–΄κ°ˆ μˆ˜λ„ μžˆλ‹€.

 

 μ˜€λ²„ν”Œλ‘œμš°(overflow): λ³€μˆ˜κ°€ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” λ²”μœ„λ₯Ό λ„˜λŠ” 숫자λ₯Ό μ €μž₯ν•˜λ €κ³  ν•  λ•Œ λ°œμƒν•œλ‹€.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <limits.h>
int main(void)
{
    short s_money = SHRT_MAX;// μ΅œλŒ€κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€.
    unsigned short u_money = USHRT_MAX; // μ΅œλŒ€κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€.
 
    printf("s_money = %d\n", s_money);
    printf("u_money = %d\n", u_money);
 
    s_money = s_money + 1;
    printf("s_money = %d\n", s_money);
    u_money = u_money + 1;
    printf("u_money = %d\n", u_money);
 
    return 0;
}
cs

 

 

 

 λ³€μˆ˜μ˜ 값이 λ³€μˆ˜κ°€ μ €μž₯ν•  수 μžˆλŠ” ν•œκ³„λ₯Ό λ²—μ–΄λ‚˜λ©΄ μžλ™μ°¨μ˜ μ£Όν–‰ κ±°λ¦¬κ³„μ²˜λŸΌ λ‹€μ‹œ 처음으둜 λŒμ•„κ°€μ„œ μ‹œμž‘ν•œλ‹€.

 μ •μˆ˜ν˜•μ—μ„œ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•˜λ”λΌλ„ μ»΄νŒŒμΌλŸ¬λŠ” μ•„λ¬΄λŸ° κ²½κ³ λ₯Ό ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ •μˆ˜ν˜•μ„ μ‚¬μš©ν•  λ•ŒλŠ” μ˜€λ²„ν”Œλ‘œμš°κ°€ μΌμ–΄λ‚˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•˜μ—¬μ•Ό ν•œλ‹€.

 

 

 


μž…μΆœλ ₯ ν˜•μ‹ μ§€μ •μž

 

printf() ν•¨μˆ˜λ‚˜ scanf() ν•¨μˆ˜μ—μ„œ μ •μˆ˜ν˜•μ„ μž…μΆœλ ₯ν•˜λŠ” ν˜•μ‹ μ§€μ •μžλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

 

μžλ£Œν˜• ν˜•μ‹ μ§€μ •μž μ„€λͺ…
short %hi μž…λ ₯ν•  λ•ŒλŠ” %hiλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€, 좜λ ₯μ‹œμ—λŠ” %d도 κ°€λŠ₯ν•˜λ‹€.
int %d x
long %ld x
long long %lld 특히 μž…λ ₯ν•  λ•ŒλŠ” λ°˜λ“œμ‹œ %lldλ₯Ό μ‚¬μš©ν•˜μ—¬μ•Ό ν•œλ‹€. 좜λ ₯ μ‹œμ—λ„ %lldλ₯Ό μ‚¬μš©ν•˜μ—¬μ•Ό ν•œλ‹€.

 

 

 


μ •μˆ˜ν˜• μƒμˆ˜

 

 μ •μˆ˜ μƒμˆ˜λŠ” 12λ‚˜ 100κ³Ό 같이 ν”„λ‘œκ·Έλž¨ μ•ˆμ— 직접 μž…λ ₯ν•˜λ©΄ λœλ‹€.

 

 μ •μˆ˜ μƒμˆ˜λŠ” 기본적으둜 intν˜•μœΌλ‘œ κ°„μ£Όλœλ‹€.

 

 λ§Œμ•½ μƒμˆ˜μ˜ μžλ£Œν˜•μ„ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ§€μ •ν•˜κ³  싢은 κ²½μš°λŠ” 접미사λ₯Ό 뢙인닀.

 

 123L처럼 μ •μˆ˜ μƒμˆ˜ 뒀에 μ ‘λ―Έμ‚¬λ‘œ L을 뢙이면 123μ΄λΌλŠ” μƒμˆ˜λ₯Ό longν˜•(32λΉ„νŠΈ)으둜 κ°„μ£Όν•œλ‹€.

 

 

[μ •μˆ˜ μƒμˆ˜]

접미사 μžλ£Œν˜• 예
u λ˜λŠ” U unsigned int 123u λ˜λŠ” 123U
l λ˜λŠ”  L long 123l λ˜λŠ” 123L
ul λ˜λŠ” UL unsigned long 123ul λ˜λŠ” 123UL

 

 μ •μˆ˜ μƒμˆ˜λŠ” 10μ§„λ²•λΏλ§Œ μ•„λ‹ˆλΌ 8μ§„λ²•μ΄λ‚˜ 16μ§„λ²•μœΌλ‘œλ„ ν‘œκΈ°κ°€ κ°€λŠ₯ν•˜λ‹€.

 

 μ •μˆ˜ μƒμˆ˜λ₯Ό 8μ§„λ²•μœΌλ‘œ ν‘œκΈ°ν•˜λ €λ©΄ μ•žμ— 0을 뢙이면 λœλ‹€. 

 

 16μ§„λ²•μœΌλ‘œ μ •μˆ˜ μƒμˆ˜λ₯Ό ν‘œκΈ°ν•˜λ €λ©΄ μ•žμ— 0xλ₯Ό 뢙이면 λœλ‹€.

 

 16진법은 0μ—μ„œ 9κΉŒμ§€μ˜ 10개의 μˆ«μžμ™€ A, B, C, D, E, FκΉŒμ§€ 6개의 문자λ₯Ό μΆ”κ°€ν•˜μ—¬ 수λ₯Ό ν‘œν˜„ν•˜λŠ” 방법이닀.

 

 μ˜ˆλ₯Ό λ“€μ–΄μ„œ 41719λ₯Ό 16μ§„μˆ˜λ‘œ λ‚˜νƒ€λ‚΄λ³΄λ©΄ 0xA2F7이 λœλ‹€.

 

 

 

  μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ”λ° A와 B와 같은 문자λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ²˜μŒμ—λŠ” μƒμ†Œν•΄λ³΄μΌ 것이닀. ν•˜μ§€λ§Œ ν•˜λ“œμ›¨μ–΄ κ΄€λ ¨ν•˜μ—¬ λΉ„νŠΈ μ‘°μž‘μ„ ν•  λ•ŒλŠ” 10진법보닀 16진법이 훨씬 μ‚¬μš©ν•˜κΈ°κ°€ νŽΈλ¦¬ν•˜λ‹€.

 

 2μ§„μˆ˜μ™€ 16μ§„μˆ˜λŠ” μƒλ‹Ήν•œ 관련이 μžˆλ‹€. 16μ§„μˆ˜μ—μ„œ ν•˜λ‚˜μ˜ μžλ¦Ώμˆ˜λŠ” 4λΉ„νŠΈμ— ν•΄λ‹Ήν•œλ‹€. λ”°λΌμ„œ 0κ³Ό 1둜 λ˜μ–΄ μžˆλŠ” 데이터λ₯Ό 16μ§„μˆ˜λ‘œ ν‘œκΈ°ν•˜κ²Œ 되면 μ•Œμ•„λ³΄κΈ°κ°€ 쉽닀.

 

0x0f(16μ§„μˆ˜) ↔ 0000 1111(2μ§„μˆ˜)

 

 

 λ‹€μŒ ν”„λ‘œκ·Έλž¨μ€ μ •μˆ˜ μƒμˆ˜ 128을 10μ§„μˆ˜, 16μ§„μˆ˜, 8μ§„μˆ˜λ‘œ 좜λ ₯ν•΄λ³Έ 것이닀.

 

1
2
3
4
5
6
7
#include <stdio.h>
 
int main(void)
{
    printf("%d %#x %#o \n"128128128);
    return 0;
}
cs

 

 

 

 μ •μˆ˜ν˜•μ˜ 값을 좜λ ₯ν•˜κ±°λ‚˜ μž…λ ₯ν•˜λ €λ©΄ ν˜•μ‹ μ§€μ •μžλ‘œ "%d"λ₯Ό μ‚¬μš©ν•œλ‹€.

 

 8μ§„μˆ˜λ‚˜ 16μ§„λ²•μœΌλ‘œ μ •μˆ˜λ₯Ό 좜λ ₯ν•  λ•Œ μ‚¬μš©ν•˜λŠ” ν˜•μ‹μ§€μ •μž: "%#o", "%#x"λ₯Ό μ‚¬μš©ν•œλ‹€.

 

 

 


기호 μƒμˆ˜(#define 이용)

 λ³΄ν†΅μ˜ μƒμˆ˜μ—λŠ” λ³€μˆ˜μ™€λŠ” 달리 이름이 μ—†λ‹€. κ·ΈλŸ¬λ‚˜ μƒμˆ˜μ—λ„ 이름을 뢙일 수 μžˆλŠ” 방법이 μžˆλ‹€.

 

 κΈ°ν˜Έ μƒμˆ˜(symbolic constant)λŠ” κΈ°ν˜Έμ— μ˜ν•˜μ—¬ μƒμˆ˜λ₯Ό ν‘œν˜„ν•œ 것이닀. 

 

 μ΄λ¦„ μ—†λŠ” μƒμˆ˜λŠ” λ¦¬ν„°λŸ΄ μƒμˆ˜(literal)라고 ν•œλ‹€. 예λ₯Ό λ“€μ–΄μ„œ ν˜„μž¬μ˜ ν™˜μœ¨ 1120을 기호 μƒμˆ˜ EXCHANGE_RATE둜 ν‘œν˜„ν•΄λ³΄μž.

#define EXCHANGE_RATE	1120

 

 λ³΄ν†΅ #define λ¬Έμž₯은 ν”„λ‘œκ·Έλž¨μ˜ 맨 첫 뢀뢄에 λͺ¨μ—¬ μžˆλ‹€. #define이 λ“€μ–΄κ°€λŠ” λ¬Έμž₯은 μ „μ²˜λ¦¬κΈ°(preprocessor)κ°€ μ²˜λ¦¬ν•œλ‹€. μ „μ²˜λ¦¬κΈ°λŠ” μ½”λ“œμ—μ„œ EXCHANGE_RATEλ₯Ό μ „λΆ€ μ°Ύμ•„μ„œ 1120으둜 λ°”κΎΌλ‹€.

 

 

 κΈ°ν˜Έ μƒμˆ˜λŠ” μƒμˆ˜ 값을 κ·ΈλŒ€λ‘œ μ“°λŠ” 방법(λ¦¬ν„°λŸ΄ μƒμˆ˜)에 λΉ„ν•˜μ—¬ λͺ‡ κ°€μ§€μ˜ μž₯점을 μ§€λ‹Œλ‹€.

 

1. 기호 μƒμˆ˜λ₯Ό μ΄μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ„ 읽기가 μ‰¬μ›Œμ§„λ‹€.: μ•„λž˜μ˜ λ¬Έμž₯ (1)μ—μ„œλŠ” 1120이 무엇을 μ˜λ―Έν•˜λŠ”μ§€ μ‰½κ²Œ μ•Œ 수 μ—†λ‹€. κ·ΈλŸ¬λ‚˜ λ¬Έμž₯ (2)μ—μ„œλŠ” ν™˜μœ¨μ΄λΌλŠ” 것을 μ‰½κ²Œ μ•Œ 수 μžˆλ‹€.

 

won = 1120 * dollar;            // (1) μ‹€μ œμ˜ 값을 μ‚¬μš©
won = EXCHANGE_RATE * dollar;   // (2) κΈ°ν˜Έμƒμˆ˜ μ‚¬μš©

 

2. ν”„λ‘œκ·Έλž¨μ΄ λ™μΌν•œ μƒμˆ˜λ₯Ό μ—¬λŸ¬ κ³³μ—μ„œ μ‚¬μš©ν•˜κ³  μžˆλŠ” κ²½μš°μ—, μƒμˆ˜ κ°’μ˜ 변경을 μ‰½κ²Œ ν•  수 μžˆλ‹€λŠ” 것이닀. μœ„μ˜ μ˜ˆμ—μ„œ ν™˜μœ¨μ΄ 1050으둜 λ³€κ²½λ˜μ—ˆλ‹€κ³  κ°€μ •ν•˜μž. λ§Œμ•½ 숫자λ₯Ό μ‚¬μš©ν–ˆλ‹€λ©΄ ν”„λ‘œκ·Έλž¨μ—μ„œ κ·Έ μˆ«μžκ°€ μ‚¬μš©λœ λͺ¨λ“  곳을 μ°Ύμ•„μ„œ 값을 λ³€κ²½ν•˜μ—¬μ•Ό ν•œλ‹€, κ·ΈλŸ¬λ‚˜ κΈ°ν˜Έ μƒμˆ˜λ₯Ό μ‚¬μš©ν–ˆλ‹€λ©΄ 기호 μƒμˆ˜μ˜ μ •μ˜λ§Œ λ³€κ²½ν•˜λ©΄ λœλ‹€.

 

 

λ¦¬ν„°λŸ΄ μƒμˆ˜μ™€ 기호 μƒμˆ˜μ˜ 비ꡐ

 

 

 


기호 μƒμˆ˜(const 이용)

 

 κΈ°ν˜Έ μƒμˆ˜λ₯Ό λ§Œλ“œλŠ” 또 ν•˜λ‚˜μ˜ 방법이 μžˆλ‹€. λ³€μˆ˜ μ„ μ–Έ μ•žμ— constλ₯Ό 뢙이면 μƒμˆ˜κ°€ λœλ‹€.

 

 constλŠ” "constant"의 μ•½μžλ‘œμ„œ λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ˜λ―Έμ΄λ‹€.

 

const int EXCHANGE_RATE = 1120;

 

 μœ„μ˜ μ½”λ“œμ—μ„œ EXCHANGE_RATEλŠ” μƒμˆ˜λ‘œμ„œ 1120을 λ‚˜νƒ€λ‚Έλ‹€. const둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” λ”± ν•œ 번만 값을 μ €μž₯ν•  수 μžˆλ‹€.