C언어 복습 14 (자료형)
참고: 정덕 - <컴맹을 위한 C언어>
♨ 개인적 해석이 다분한 글임으로, 인지하지 못한 오류가 있을 수 있습니다 ♨
▣ 자료형의 대분류 : 정수형 / 실수형
▣ sizeof 연산자
- 정수형, 실수형의 구분 안에서 크기에 따라 자료형 한번 더 분류
- 자료형의 크기: 특정 자료형으로 변수를 선언했을 때 변수가 메모리에서 차지하는 공간의 크기
-> sizeof 연산자를 통해 자료형의 크기 파악 가능
예)
※sizeof 연산의 결과값은 size_t 자료형의 데이터
-> size_t는 C언어 표준에 의해 양의 정수(unsigned int)로 정의 but 크기는 4, 8바이트
C99 표준에서부터 8바이트 양의 정수를 출력할 수있는 %zu 사용가능(dev에서는 지원X)
대신 %Id(signed size_t)와 %Iu(unsigned size_t)로 출력할 수 있다
- 정수형
※ long long a =2300000000;
위의 코드를 실행하면 경고나 에러가 발생
->정수를 그냥 쓰면 int형으로 인식 / 23억은 int로 표현 불가
=>long long형 상수를 쓸때는 접미어LL을 붙여야 한다
∴long long a = 2300000000LL;
※ long long 출력 시에 %Id 서식문자 사용해야 한다 unsigned long long의 경우 %Iu를 사용
- 실수형
*정수형과 실수형의 차이점(long도 4바이트, float도 4바이트인데 무슨차이가 있나?)
- 비트를 사용하는 방법에서의 차이
예) char a=4; 일때 컴퓨터가 2진수로 데이터를 저장한다면
0 0000100
부호비트 숫자비트들(정식용어X, 편의상)
맨 앞의 비트로 부호를 표현: 0이면 양수, 1이면 음수
이때 4의 부호를 음수로 바뀌면 -4가 되겠구나해서 바꾸면,
1 0000100
부호비트가 1(음수니까), 숫자부분은 100이니까 10진수로는 4 합치면 -4???
그러나!! 실제로는 -124의 비트
4+(-4) = 0 임을 이용하여 이것을 증명해보면
00000100
+10000100
--------------
10001000 ≠ 0
∴10000100 ≠ -4
=> 컴퓨터의 음수 표현법 = 2의 보수법
1. 전체 비트의 1과 0을 반전시킨다
2. 1을 더한다
예) 2진수 4 = 00000100
반전(1.)-> 11111011
=1(2.)-> 11111100 = 10진수 -4
다시 한번 4+(-4)=0 을 통해 증명해보면
00000100
+11111100
---------------
100000000 -> char는 8비트이기에 9번째 자리는 버려진다
= 00000000
∴11111100 = -4
2의 보수법으로 표현된 음수는 다시 2의 보수법으로 변환하면 그 절댓값(양수값)을 알 수 있다
▣ 양의 정수
- 양의 정수를 표현하는 자료형 = 정수 자료형 앞에 "unsigned"라는 키워드를 붙여 선언
unsigned char v1;
unsigned short v2;
unsigned int v3;
unsigned ling v4;
unsigned long long v5;
unsigned = 부호가 없다(+,-가 없으면 무적권 +)
-> 비트 전체가 숫자를 표현하기에 음수를 표현할 수 없다
-> 맨 앞 자리가 부호비트가 아니기에 더 많은 수를 표현 할 수 있다(실수형은 적용X)
▣ 실수형
- 실수는 부동소수점(M*r^n)으로 표현
M: 가수
r: 밑수 = 2로 고정
n: 지수
1. 4바이트 실수(float)
-맨 앞의 비트를 부호비트로 사용(정수형과 동일)
-부호 비트 이후 8비트 = 지수 / 나머지 23비트 = 가수 표현
2. 8바이트 실수(double)
-형태는 float과 동일
-부호 이후 23비트 = 지수 / 나머지 52비트 = 가수 표현
*정수형이 저장할 수 있는 숫자 범위
-1비트로 표현할 수 있는 정보 0 , 1 -> 2개
-2비트 1) 양수만 표현 할 경우(unsigned) 00(0), 01(1), 10(2), 11(3) -> 0~3 : 4개
2) 음수도 표현할 경우 00(0), 01(1), 10(-2), 11(-1) -> -2~1 : 4개
-3비트 1)양수만 000(0), 001(1), 010(2), 011(3), 100(4), 101(5), 110(6), 111(7) -> 0~7 : 8개
2)음수도 000(0), 001(1), 010(2), 011(3), 100(-4), 101(-3), 110(-2), 111(-1) -> -4~3 : 8개
- 위 자료를 기반으로 일반화를 해본다면
n개의 비트에 표현할 수 있는 숫자의 개수와 범위
-> 비트의 개수: n개
표현 가능한 숫자 개수: 2^n개
양수만 표현할 경우 숫자 범위: 0~2^(n-1)
음수만 표현할 경우 숫자 범위: -2^(n-1) ~ 2(n-1)-1
1. char -1바이트 = 8비트 ∴ 2^8(256)개 표현 가능
1) unsigned: 0~255
2) signed :-128~127
2. short -2바이트 = 16비트 ∴ 2^16(65,536)개 표현 가능
1) unsigned: 0~65,535
2) signed: -32,768~32,767
3. int/long -4바이트 =32비트 ∴ 2^32(4,294,967,296)개 표현 가능
1) unsigned: 0~ 4,294,967,295
2) signed: -2,147,483,648~2,147,483,647
4. long long -8바이트 = 64비트 ∴ 2^64(18,446,744,073,709, 551,616)개 표현 가능
1) unsigned: 0~18,446,744,073,709, 551,615
2) signed: -9,223,372,036,854,775,808~9,223,372,036,854,775,807
※ printf 서식문자
printf("%a", b); -> c
(서식문자 = a, 대상형태 = b, 결과 = c)