일
KNK Chap.7 (7.1) 본문
07 기본형
이제까지 int와 float이라는 C언어의 기본(내장)형basic type을 사용해왔음.
7단원부터는 그 이외의 기본형을 배울 것임.
간단히 소개하자면 정수형, 소수형, 문자형, 형변환, 형정의를 배우게 될 것임.
7.1 정수형
정수형은 유부호signed와 무부호unsigned 두 가지로 나뉨.
유부호 정수의 값이 0 또는 양수라면, 해당 정수의 맨 좌측 비트(부호 비트sign bit)는 0임.
유부호 정수의 값이 음수라면 맨 좌측 비트는 1임.
기본적으로 C에서 정수형 변수는 유부호이고, 맨 좌측 비트는 부호 비트임.
컴파일러에게 무부호 정수형이라고 지시하고 싶으면 unsigned 로 선언하면 됨.
부호 비트가 없는 무부호 정수는 맨 좌측 비트도 숫자를 표시하는 비트가 됨.
무부호 숫자는 시스템 프로그래밍, 로우 레벨 및 기계와 가까운 어플리케이션 개발에 적합함.
C의 정수형들은 크기가 다 다름. 예를 들어 int형은 주로 32비트지만 오래된 CPU에선 16비트도 됨.
몇몇 프로그램은 int에서 저장할 수 없을 만큼 큰 숫자가 필요해서 long 정수형을 씀.
또 어떤 경우는 int보다 메모리 공간을 덜 쓰는 자료형을 지시해야 해서 short 정수형을 씀.
위의 경우를 모두 나누면 6가지 정수형이 나옴.
short int
unsigned short int
int
unsigned int
long int
unsigned long int
C에선 위 정수형 쓸 때 int를 생략해줄 수도 있음. 굳이 int 명시할 필요가 없다면 생략해도 됨.
그래도 규칙은 있음.
1. short int, int, long int 는 최소한의 범위를 맞춰 줘야 함(자세한건 23.2단원 참고).
2. 무조건 int 값의 범위 ≥ short int 값의 범위
3. 무조건 long int 범위 ≥ int 범위
<16비트 환경에서 일반적인 정수형의 값의 범위>

<32비트 환경에서 일반적인 정수형의 값의 범위>

<64비트 환경에서 일반적인 정수형의 값의 범위>

대충 이런 범위가 일반적이라는 거고, 모든 컴파일러 및 컴퓨터에서 필수 적용되는 건 아님.
해당 환경에서의 최대값과 최소값을 확인하려면 표준 라이브러리 중 <limits.h> 헤더파일 이용.
이 헤더파일은 각 정수값의 최소/최대 값을 나타내는 매크로를 정의해놓았음.
C99의 정수형 [C99]
long long int, unsigned long long int가 추가됨. 최소 64비트 자료형임.
구현 정의되는 확장 정수형extended integer type이라고 부르고, 128비트 정수형 지원 가능함.
이와 달리 위에서 배운 정수형들은 표준 유부호 정수형standard signed integer type,
표준 무부호 정수형standard unsigned integer type이라고 부름.
정수형 상수
상수constant는 C에서 정수형 산수로서는 10진수, 8진수, 16진수 세 가지 방법으로 작성 가능.
8진수octal는 0에서 7까지의 숫자만을 사용한 수체계임.
8진수에서 각 자릿수는 8의 제곱수임. 예를 들어 8진수로 237을 10진수로 치환하면 159임.
16진수hexadecimal/hex는 0에서 9, 이후엔 A에서 F를 사용한 수체계임.
A에서 F는 10진수로 10에서 15를 의미하고, 16진수의 각 자릿수는 16의 제곱수임.
예를 들어 16진수 1AF를 10진수로 치환하면 431임.
기억해야 할 것 ↓
○ 10진수decimal 상수는 0에서 9까지의 숫자를 쓰지만, 0으로 시작하지 않음
ex. 15, 255, 32767
○ 8진수octal 상수는 0에서 7까지의 숫자를 쓰며 반드시 0으로 시작
ex. 017, 0377, 077777
○ 16진수hexadecimal 상수는 0에서 9까지의 숫자와 a에서 f까지의 알파벳을 쓰며 반드시 0x로 시작
ex. 0xf, 0xff, 0x7fff
+ 16진수 상수들의 문자들은 대소문자 구분을 하지 않아도 됨
0xff 0xfF 0xFf 0xFF 0Xff 0XfF 0XFf 0XFF
방식이 어떻든 정수는 언제나 2진수로 저장되기에, 숫자를 바라보는 방식이 다르다고만 인식하라.
숫자의 표현 방식은 섞어서도 쓸 수 있음.
8진수와 16진수 상수를 저장하는 규칙은 10진수와 살짝 달라서 무조건 long int로 저장되진 않음.
컴파일러가 int, unsigned int, long int, unsigned long int를 쭉 둘러보고 가장 적합한 자료형을 고름.
컴파일러가 해당 상수를 강제로 긴 정수형으로 취급하게 만들고 싶으면
상수 뒤에 L(l) 적어주면 됨.
상수를 무부호로 만들고 싶으면 상수 뒤에 U(u) 적어주면 됨.
L과 U는 혼용 가능함.
C99에서의 정수형 상수 [C99]
C99에서 정수형 상수를 새 정수형 long long int로 강제하고 싶으면 상수 뒤에 LL(ll) 적어주면 됨.
LL(ll) 앞이나 뒤에 UU(uu)를 추가하면 unsigned long long int가 됨.
상수의 모든 접미사는 해당 상수가 가능한 자료형의 범위를 제한해줌.
해당 상수가 표준 정수형으로 감당이 안되면 확장 정수형이 될 수도 있음.
정수 초과
정수 간 산술 연산 중 결과 값이 해당 정수형의 값의 범위를 벗어날 때가 있음.
이 경우를 초과overflow가 발생했다고 말함.
정수 초과 발생 양상은 유부호/무부호에 따라 다름.
유부호signed 정수간 연산에서 초과 발생 시 프로그램은 다양한 종류 중 하나의 불능행동을 함.
무부호unsigned 정수간 연산에서 초과 발생 시 프로그램은 정의된 행동을 함.
n이 결과값을 저장하는데 사용된 비트의 수라면, 모듈로 2^n에 따른 정답을 얻음.
예를 들어 무부호 16비트 숫자 65,535에 1을 더하면 결과값은 반드시 0임.
숫자 입력 및 출력
어떤 프로그램 내 int 변수 하나가 초과됐다고 곧장 long int로 바꾸는게 능사가 아님.
그 변화가 프로그램 전체에 미칠 영향도 계산해야 함.
예를 들어 printf나 scanf에서 그 변수가 사용됐는지. 사용됐으면 서식 문자열 %d를 수정해야 함.
아래의 변환 규격자들은 무부호, 짧은, 긴 정수를 읽고 쓰는데 필요한 변환 규격자들임.
unsigned int u;
scanf("%u", &u); /* reads u in base 10 */
printf("%u", u); /* writes u in base 10 */
scanf("%o", &u); /* reads u in base 8 */
printf("%o", u); /* writes u in base 8 */
scanf("%x", &u); /* reads u in base 16 */
printf("%x", u); /* writes u in base 16 */
○무부호를 읽을 땐 d 대신 u(10진수),o(8진수),x(16진수)를 써야 함.
○ 짧은short 정수형을 읽거나 쓸 땐 아래처럼 h 문자를 d,o,u,x 앞에 추가해줘야 함.
short s;
scanf("%hd", &s);
printf("%hd", s);
○ 긴long 정수형을 읽거나 쓸 땐 아래처럼 l 문자를 d,o,u,x 앞에 추가해줘야 함.
long l;
scanf("%ld", &l);
printf("%ld", l);
○ 길고 긴long long 정수형을 읽거나 쓸 땐 아래처럼 ll 문자를 d,o,u,x 앞에 추가해줘야 함.
long long l;
scanf("%lld", &ll);
printf("%lld", ll);
[프로그래밍] 수열의 합 구하기 2
6.1단원의 프로그램을 더 발전시켜서, 변수를 long으로 변환해줄 것임.

n과 sum을 int 대신 long 변수로 선언했고
scanf와 printf에 있는 변환 규격자들을 %d에서 %ld로 바꿔줬음.
'C' 카테고리의 다른 글
| KNK 공부 중단 (0) | 2023.02.07 |
|---|---|
| KNK Chap.6 (6.5~Q&A) (0) | 2022.12.19 |
| KNK Chap.6 (6.4) (0) | 2022.12.16 |
| KNK Chap.6 (6.3) (0) | 2022.12.16 |
| KNK Chap.6 (6.2) (0) | 2022.12.16 |