보수법
컴퓨터는 항상 숫자로 모든 것을 구분하고 내부적으로는 덧셈밖에 할 줄 모르는 가산기이다
뺄셈을 하기 위해 +와 - 를 구분시킨 것이 부호비트 방식이다. +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 | |
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 프로그래밍 기본 문법부터 실전 예제까지 (장성택 지음)
'컴퓨터 > C#' 카테고리의 다른 글
[C#] 반복문 (0) | 2020.05.26 |
---|---|
[C#] 연산자 (0) | 2020.05.26 |
[C#] 형변환, 산술연산자( /, %), if문, switch문 (0) | 2020.05.25 |
[C#] 문자형 기본타입과 형변환, 문법 요소 , 콘솔창에서 값 입력받아 출력하기 (0) | 2020.05.23 |
[C#] 비주얼 스튜디오 2019 설치와 "지옥으로 키티" 출력하기 (0) | 2020.05.21 |