NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 8. Integral 형식

    페이지 정보

    본문

    요즘 유해준씨의 "나에게 그대만이 (다함께 차차차 O.S.T)"라는 노래를 알게 되어 듣고 있습니다. 이렇게 좋은 노래를 이제서야 알게 되었다니-_-; 2009년에 방영한 TV 드라마군요. 아무튼~ C# 정수 계열의 모든 형식은 Integral type으로 부릅니다. 보통 Integral 또는 Integer라 하면 정수를 의미하며 통계에서는 적분을 나타내기도 합니다.

     

    Integral은 "전체" 또는 "완전한"이란 뜻을 가지고 있으며, 한자어인 정수(整數)는 보통 Integer를 말합니다. 재미로, 하나 더 정수를 사용하는 곳이 있는데 보통 무협지에 보면 "무공의 정수를 보여주는 무림의 절대 고수 xxx..."와 같이 우리 일상 생활에서도 자주 사용되는 精髓는 뼈속의 골수라는 의미로 어떤 사물 또는 그룹에 중심을 나타냅니다. 위의 무공의 정수는 아마도 핵심 기술이나 초필살기 정도로 해석할 수 있을거 같네요.

    q8BvJ4a.gif

     

     

    다음 표에서는 단순 형식의 하위 집합을 구성하는 정수 계열 형식의 크기 및 범위를 보여 줍니다. 각 형식의 앞에는 부호를 나타내는 Alias가 붙어 있습니다. s(Signed) 또는 u(Unsigned)로 표시하며 s는 부호(+, -)를 가지는 자료형입니다. 반대로 u는 부호를 가지지 않는 자료형임을 의미합니다.

    형식

    범위

    크기

     sbyte

     -128 ~ 127

     부호 있는 8비트 정수

     byte

     0 ~ 255

     부호 없는 8비트 정수

     char

     U+0000 ~ U+ffff

     유니코드 16비트 문자

     short

     -32,768 ~ 32,767

     부호 있는 16비트 정수

     ushort

     0 ~ 65,535

     부호 없는 16비트 정수

     int

     -2,147,483,648 ~ 2,147,483,647

     부호 있는 32비트 정수

     uint

     0 ~ 4,294,967,295

     부호 없는 32비트 정수

     long

     -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

     부호 있는 64비트 정수

     ulong

     0 ~ 18,446,744,073,709,551,615

     부호 없는 64비트 정수

     

     

    정수를 표현할 때 z로 표시하는 이유는 이 의미가 독일어인 Zahl(수, 수량)에서 왔기 때문입니다. 유리수(분수로 표현할 수 있는 수, 0은 양의 유리수도 아니고 음의 유리수도 아닙니다. 0은 분류에 속하지 않는 정수입니다.)는 영어로 하면 Rational number의 r로 표현해야 하겠지만, 이미 실수(Real number)에서 r을 사용하고 있었기에 분수로 표현하기 위한 나눗셈의 몫을 뜻하는 Quotient의 첫 글자를 따와서 q로 표시하게 되었습니다.

     

    참고로, C#에서 정수(상수)는 0으로 나눌 수 없습니다. 하지만, 부동 소수점은 0으로 나누더라도 컴파일 에러를 발생시키지 않습니다. 이유는 C#이 IEEE 754를 기반으로 하기 때문에 발생되는 문제입니다. IEEE 754는 무한대의 수를 표현하는 NaN을 정의하고 있어서 C#에서는 무한대에 있는 숫자의 상태를  "± ∞"(Infinite)  기호로 표시합니다. 따라서 숫자가 아닌 상태이므로 산술 오버플로우 에러를 발생시키지 않게 됩니다. 아이폰 게임중에 인피니티 블레이드가 생각나네요. (무한으로 환생하면서 이야기를 풀어나가는 게임입니다.)

    h0zBvnC.png

     

     

    이정도만 알아두시면 될거 같구요. 아래에서 Signed와 Unsigned에 대한 테스트를 해보면 간단하게 자료형에 대해 알 수 있습니다. Console 응용 프로그램에서 Main에 아래와 같이 코드를 입력합니다.

    using System;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Signed / Unsigned            
                byte a = 255;
                sbyte b = (sbyte)a;
                Console.WriteLine(a);
                Console.WriteLine(b);
                Console.ReadLine();
            }
        }
    }

     

     

    위의 표에서 byte와 sbyte의 자료형을 확인한 후 실행해 봅니다.

    kkEK3Ga.png

     

     

    각 자료형이 표현하는 부호 및 자리수는 확인하는 코드로 변경한 후 실행해 보세요.

    using System;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                sbyte a = -10;
                byte b = 40;
                Console.WriteLine("a={0}, b={1}", a, b);
                short c = -30000;
                ushort d = 60000;
                Console.WriteLine("c={0}, d={1}", c, d);
                int e = -10000000;
                uint f = 300000000;
                Console.WriteLine("e={0}, f={1}", e, f);
                long g = -500000000000;
                ulong h = 2000000000000000000;
                Console.WriteLine("g={0}, h={1}", g, h);
                Console.ReadLine();
            }
        }
    }

     

     

    아래 예제에서는 Signed와 Unsigned의 Conversion시 주의해야 할 사항을 잘 보여주고 있습니다.

    using System;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int a = 500;
                Console.WriteLine(a);
                uint b = (uint)a;
                Console.WriteLine(b);
                int x = -30;
                Console.WriteLine(x);
                uint y = (uint)x;
                Console.WriteLine(y);
                Console.ReadLine();
            }
        }
    }

     

     

    결과는 아래와 같습니다.

    CYIpqoW.png

     

     

    이와같은 현상은 부호가 있는 정수 계열 형식의 개체를 부호가 없는 형식으로 변환할 수 있지만, 이런 변환 과정을 거칠 때 실제 비트 패턴은 변경되지 않기 때문입니다. 하지만, 데이터의 해석은 변경되므로 잘못된 해석을 하고 그 결과를 반환하게 됩니다.

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.