1-2. 데이터 : 형변환

Date:     Updated:

카테고리:

태그:

인프런에 있는 Rookiss님의 강의 Part1: C# 기초 프로그래밍 입문 를 듣고 정리한 필기입니다. 😀

🚖 데이터 종류

정수는 이전 포스트

Boolean

            bool b;
            b = true;
            b = false;

true, false 판별하는데 1 bit만 필요하지만 boolean 타입이 1 byte 크기인 이유는, 컴퓨터는 1 byte 단위로 일을 하기 때문에 맞춰 준 것 뿐이다.

  • True 👉 00000001
  • false 👉 00000000


실수 (float, double)

            float f = 3.14f;  // 4byte 
            double d = 3.14; // 8byte 
  • 실수의 연산은 정수 연산보다 비싸다.
  • 실수는 딱 떨어지게 표현되기 힘들다. 컴퓨터가 온갖 이진수의 조합으로 최대한 근접하게 그 실수를 표현한 것일 뿐이기 때문이다.
  • float 👉 4 byte
    • 7 자리 정도까지 정밀
    • 소수단위까지 정밀하게 판정할 필요가 없는 게임 정도는 float만 해도 충분하다.
  • double 👉 8byte
    • 15 자리 정도까지 정밀
    • float보다 더 정밀하지만 메모리를 두배로 더 차지한다.


🚖 형변환

바구니 크기가 다른 경우

int a = 1000;  // 4 byte
long l = a;  // 가능

8 byte 바구니에 4 byte 를 넣는 것은 데이터가 손실 될 일이 없으므로 가능하다. 큰 바구니에 작은 물건을 넣는 것은 문제 없다.

            int a = 1000;  // 
            short s1 = a;  // ❌에러
            short s2 = (short)a;  // 꾸겨넣음

4 byte 크기인 a 데이터를 2 byte 인 s1에서 담으려고 하니 에러가 발생한다. 작은 바구니에 큰 물건을 담을 수 없다고.. 아래와 같이 강제적으로 형변환을 해주면 문제 없다. 단, 데이터가 손실될 수 있다.

            int a = 0x00ffffff;
            short b = (short)a;  // -1이 들어감 (0xFFFF)만 저장이 되어서

b는 2 byte (16bit) 짜리 바구니이므로 4 byte (32bit)인 a 데이터를 강제로 형변환하니 -1이 되었다. ffff 이렇게 16bit 만 들어가게 되어 -1 이 되버린 것이다. 이처럼 더 작은 크기를 가진 데이터에 값을 넣으려고 하면 데이터 손실 문제가 발생할 수 있다.


바구니는 같으나 부호가 다른 경우

            byte b = 255;  // 0xFF = 0b11111111
            sbyte sb = (sbyte)c; // sbyte에선 0b11111111 는 -1. sb 는 -1가 됨

  • byte 8byte. (0 ~ 255) 범위만 표현 가능
  • sbyte 8byte. (-128 ~ 127) 범위만 표현 가능

bytesbyte는 크기가 같지만, 범위가 다르기 때문에 255 를 sbyte에선 제대로 표현할 수가 없다. 255를 sbyte에 강제적으로 담으면 범위를 넘어서 다시 최소 범위로 순환하게 되버리기 때문에 underflow 가 일어나 -1이 된다.


소수 변환

컴퓨터는 이진수들의 합으로 해당 실수와 최대한 인접한 값을 표현한다. 그래서 실수 데이터인 floatdouble정밀도라는 용어가 근접하는 것이다.

float f = 3.1414f;
double d = f;  // 3.1414000980652

3.1414000980652 👉 3.14를 표현하기 위한 컴퓨터의 노력… float 에선 3.1414000 였겠지만 이것도 사실 정밀하게 딱 떨어지는 3.14는 아니다. 4byte라는 한정된 크기에 의해 3.1414000 까지만 담긴 것뿐.

📢 따라서 소수끼리의 비교는 == 를 쓰면 안된다. 어느 정도 오차가 나면 두 소수가 같다고 볼지, 이런 식으로 비교를 해야 한다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기