c#/문법

c# 문법 01 - 자료형 과 실수 표현 방식(부동 소수점, 고정 소수점)

mynote6590 2024. 11. 22. 17:58

자료형을 사용하는 이유

각 자료형마다 차지하는 메모리의 크기가 다르기 때문에 알맞은 자료형을 사용함으로써 메모리의 낭비를 줄일 수 있다.

 

정수형 기본 타입

데이터 형식 설명 크기(바이트) 범위
byte 정수 1 (8비트) 0 ~ 255
sbyte 부호 있는 정수 1 (8비트) - 128 ~ 127
short 작은 정수 2 (16비트) - 32,768 ~ 32,767
ushort 부호없는 작은 정수 2 (16비트) 0 ~ 65,535
int 정수 4 (32비트) - 2,147,483,648 ~ 2,147,483,647
uint 부호없는 정수 4 (32비트) 0 ~ 4,294,967,295
long 큰 정수 8 (64비트) - 9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
ulong 부호없는 큰 정수 8 (64비트) 0 ~ 18,446,744,073,709,551,615
char 유니코드 문자 2 (16비트)  

 

 

 

 

실수형 기본 타입

데이터 형식 설명 크기(바이트) 범위
float 단일 정밀도 부동 소수점 형식
(7개의 자릿수)
4 (32비트) -3.402823e38 ~ 3.402823e38
double 복수 정밀도 부동 소수점 형식
(15~16개의 자릿수)
8 (64비트) -1.79769313486232e308 ~
1.79769313486232e308 
decimal 29자리 데이터를 표현할 수 있는 소수 형식 16 (128비트) +-1.0 *

 

 

실수형 표현 방식

 

 

고정 소수점(decimal)

 

 

  • 처음 1비트는 sign(부호). 양수는 0, 음수는 1입니다.
  • 다음 15비트는 integer part(정수부)
  • 다음 16비트는 fractional part(소수부)
  • 그리고 정수부와 소수부의 경계를 소수점의 위치라고 생각하고 2진수로 변환된 수를 그대로 넣으면 됩니다.
  • 마지막으로 남는 자리는 모두 0으로 채우면 됩니다.

장점

  • 부동 소수점 방식보다 정확합니다. - 지수 표현 방식이 아니기 때문에 정확한 값이 표현 가능합니다.

 

단점

  • 정수부와 소수부가 고정되어있어 큰 자리수의 소수는 다루기 힘듭니다.

 

 

코드 사용 예시

decimal myDecimal = 123.45m;

 

 

 

 

 

 

부동 소수점(float,double)

 

  • 2진수를 정규화(normalize) 합니다.
  • 처음 1비트는 sign(부호)를 나타냅니다 (0은 양수, 1은 음수).
  • 다음 8비트는 exponent(지수부)를 나타냅니다. 정규화 과정에서 얻어낸 지수에 bias를 더한 값으로 채웁니다.
  • 다음 23비트는 mantissa(가수부)를 나타냅니다. 소수 부분의 값으로 채웁니다.

장점

  • 메모리 관리가 효율적이다

 

단점

  • 정확하지않다 (조금의 오차 발생) :  2^?라는 지수 표현 방식은 0이라는 값에 가까워 질 수는 있지만 정확히 0이 될 수는 없기 때문입니다.

 

 

정규화 예시

 

 

Exponent

 

정규화가 완료된 지수를 Exponent 부분에 바로 넣으면 안됩니다. IEEE 754 표준에서는 32비트로 실수를 표현할 때는 127(10)의 값을 더하고 그 값을 2진수로 변환하여 넣어야 합니다. 이러한 이유는 음수를 대처하기 위해서 입니다. 따라서 IEEE 754 표준에서는 8 비트로 음수와 양수 모두를 표현하기 위한 하나의 장치로 bias 라는 값을 두었습니다. 이를 통해 exponent 부분은 항상 unsigned(0과 양수) 값만 가지게 셋팅을 하는데요. 8bit는 256개의 숫자를 표현 할 수 있으므로 unsinged 값의 범위는 10진수 0~255가 되겠습니다.

 

  • 0~127 구간은 음수 (실제 exponent는 -127~0)
  • 128~255 구간은 양수 (실제 exponent는 1~128)
float myFloat = 12.34f;
double myDouble = 12.345;

 

문자형 기본 타입

데이터 형식 설명 크기
char '   ' 한글자
string "  " 정해져있지않음

 

 

논리형 기본 타입

데이터형식 설명 크기 (바이트) 범위
bool 논리 형식 1 (8비트) true,false

 

 

 

도움이 된 사이트

https://gguguk.github.io/posts/fixed_point_and_floating_point/

 

CS50 - 고정 소수점(fixed point)과 부동 소수점(floating point)

최근 사내에서 CS50 스터디를 시작했습니다. 본 포스팅은 CS50의 두번째 주제인 ‘C언어’ 강의를 듣다가 평소 궁금했던 고정 소수점(fixed point)과 부동 소수점(floating point)에 대해 추가적으로 정리

gguguk.github.io