본문 바로가기
컴퓨터/C#

[C#] 보수법과 자료형

by 아기상어  2020. 5. 22.

 

보수법


컴퓨터는 항상 숫자로 모든 것을 구분하고 내부적으로는 덧셈밖에 할 줄 모르는 가산기이다

뺄셈을 하기 위해 +와 - 를 구분시킨 것이 부호비트 방식이다. +7과 -7을 8bit 이진수로 변환시켰을때

음의 정수일때 첫번째 bit에 1을 넣어 양의 정수와 구분시키는 방법이다.

+7 0 0 0 0 0 1 1 1
-7 1 0 0 0 0 1 1 1

 

 

하지만 이 방식은 두가지 문제가 있었다

  • +0과 -0이 존재해서 0이 결과적으로 두개가 생기는 문제
  • +7과 -7을 8bit 이진수로 변환해서 서로 더했을때 값이 0이 나오지않고 십진수로 -14가 나오는 문제
+7 0 0 0 0 0 1 1 1
-7 1 0 0 0 0 1 1 1
-14 1 0 0 0 1 1 1 0

 

그래서 현재 컴퓨터에는 보수법(Comeplement)이 적용되어 있다.

n의 보수란 x에 대한 수에 더했을때 n이 되게 하는 수이다. 예를들면 7에 대한 9의 보수는 2, 9에 대한 10의 보수는 1

 

많이 쓰는것이 2의 보수인데 2의 보수란 더해서 2가 되는 수를 말하고

2는 이진법으로 '10'이 된다. 1bit에서 2를 표현하면 자리올림이 발생해 1이 사라지게 되서 결과적으로 0이된다.

 

2의 보수는 1의 보수에+1을 한것과 같으므로 각 bit마다 1이되게 만들어 주는 수를 구해서 1을 더하면 된다.

1 0 0 1

에서 각 bit가 1이 되기 위해선 2번째와 3번째 bit에 1이 더해지면 되므로

 

1의 보수를 구하면

0 1 1 0

여기에 1을 더한것이 2의 보수이다.

0 1 1 1

 

첫번째 이진수에 2의 보수를 더하게 되면

  1 0 0 1
  0 1 1 1
1 0 0 0 0

앞의 1은 버려지므로 더했을때 0이 나오게 된다.

이 방법을 이용하면 음의 정수를 해당하는 수의 양의 정수에서 2의 보수를 취해 더하는것으로
음수를 표현할 수 있고 뺄셈도 할 수 있다.

 

 

 

자료형


자료형(Data Type)은 프로그램에서 데이터를 담을 수 있는 일정한 형식을 말한다.
자료형을 선언한다는건 그 자료형의 용량만큼  메모리에 공간을 빌리는 것인데
메모리는 무한하지 않기 때문에필요한 공간만 쓰기 위하여 약속한 것이다.

 

 

 

  • 정수형 기본 타입
sbyte -128 ~ 127
byte 0 ~ 255
short -32,768 ~ 32,767
ushort 0 ~ 65,535
int -2,147,483,648 ~ 2,147,483,647
uint 0 ~ 4,294,967,295
long -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
ulong 0 ~ 18,446,744,073,709,551,615

 

int형 변수를 선언해서 값 더해보기

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _20200521_001
{
    class Program
    {
        static void Main(string[] args)
        {
            int iNum1;       // 선언
            int iNum2 = 100; // 선언과 동시에 값 부여
            int speed;
            iNum1 = 50;     // 나중에 값 부여
            speed = iNum1 + iNum2;      //같은 자료형 끼리 더하기도 가능
            Console.WriteLine(speed);
        }
    }
}

 

 

 

 

 

  • 실수형 기본 타입
C# 대응되는 닷넷 프레임워크 형식 크기
float System.SIngle 4바이트
double System.Double 8바이트
decimal System.Decimal 16바이트

float과 double 간의 선택조건은 정밀도 차이에 불과하지만
decimal의 경우 반올림 오차가 허용되지 않는 회계 계산에 적합하다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _20200521_001
{
    class Program
    {
        static void Main(string[] args)
        {
            float f = 5.2f;
            double d = 10.5;
            decimal money = 200.99m;

            Console.WriteLine(f);
            Console.WriteLine(d);
            Console.WriteLine(money);
        }
    }
}

 

 

 

 

 

  • 문자형 기본 타입
C# 닷넷 프레임워크 형식 범위 설명
char System.Char U+0000 ~ U+FFFF 유니코드 16비트 문자
string System.String 문자열 유니코드 문자열

 

사람은 숫자보단 문자로 표현하는 것이 더 익숙하다.

그래서 프로그램이나 다른 컴퓨터로 통신할때 문자를 사용하기 위해선
각 컴퓨터의 문자와 기호에 통일된 번호를 부여한것이 아스키코드(ASCII)이다.

 

하지만 1바이트의 공간에 각 나라에서 쓰는 다양한 문자를 표현하기엔 부족했고 확장할 필요가 생겼다.
이에 따라 나온게 유니코드(Unicode)이다. 유니코드는 2바이트로 모든문자를 표현하므로 최대 65536자 까지
표현할 수 있다.

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _20200521_001
{
    class Program
    {
        static void Main(string[] args)
        {
            char ch = 'A';                   //실제로는 ch에 A의 아스키코드 값인 65가 들어감
            int iNum1;
            iNum1 = ch;
            Console.WriteLine(iNum1);       // ch값 출력
            Console.WriteLine((char)iNum1); // iNum1을 char형으로 변환한 값 출력
        }
    }
}

 

 

 

 

 

 

 

 

참고자료 : C# 8.0 프로그래밍 기본 문법부터 실전 예제까지 (장성택 지음)