일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 시퀄 문법
- 가상컴퓨터마법사
- 객체의키값만 찾기
- 리엑트블로거
- js 문자열을 문자배열로
- sql like연산자
- search()
- 5.3.8 Modifying Queries
- 깃 토큰 만료
- 문자열 인터폴레이션
- Robo3T 글씨키우기
- 배열을 객체로
- 코딩 어?
- 객체의 밸류값만 찾기
- indexOf()
- ...점점점문법
- 객체를 배열로
- 우분투 시간 변경
- 프론트엔드 스쿨
- Robo3T 글씨체 변경
- findIndex()
- lastIndexOf()
- ubuntu타임존
- 스프링 데이타 JPA
- @Moditying @Query
- sql 문자열 패턴 검색
- Robo3T 폰트 키우기
- Robo3T 폰트변경
- ${변수}
- 레디스 확인
- Today
- Total
코딩기록
항해 10일)CS- 1장 정수를 비트로 표현하는 방법 본문
순서
정수를 비트로 표현하는방법
1. 양의 정수 표현
- 10진수
- 2진수
2. 2진수 덧셈
3. 음수 표현
- 부호와 크기
- 1의 부호
- 2의 부호
정수를 비트로 표현하는 방법
1. 양의 정수 표현
진법이란 사용할 수 있는 숫자의 갯수와 자리값을 정의해 주는 수 체계
10진수
일상에서 사용하는 0 ~ 9까지의 10가지 기호인 숫자
10진수 숫자를 상자라 했을때 아래 표처럼 오른쪽에서 왼쪽으로 쌓이고 각 이름들은 10의 거듭제곱에 해당한다.
5,028이라는 수의 값은 각 상자에 든 내용물의 값과 상자의 값을 곱한것을 모두 더해서 결정된다.
10진수는 5와 1000의 곱에 0과 100의 곱, 2와 10의 곱, 8과 1의 곱을 합한 값을 표현한다.
5, 0 2 8
수식 : 5 X 10³ + 0 X 10² + 2 X 10¹ + 8 X 10⁰
5 X 1000 + 0 X 100 + 2 X 10 + 8 X 1
<<< ------------------------------------------------
10진 표현법으로 표현한 수 5,028 |
||||
이름 | 천의 자리 1000 |
백의 자리 100 |
십의 자리 10 |
일의 자리 1 |
상자의 값 | 10³ | 10² | 10¹ | 10⁰ |
내용물의 값 | 5 | 0 | 2 | 8 |
표1 |
2진수
컴퓨터는 10진 숫자 대신 비트를 사용한 값과 동일하게 기호 1과 0만 으로 구성되는 2진법 체계를 쓴다.
2진수에서는 기호가 2개이기 때문에 각 상자는 자신의 오른쪽에 있는 상자의 자릿수에
2를 곱한 값의 자리를 표현한다. 즉 2의 거듭제곱을 한다.
<<< ------------------------------------------------
자릿수 | 2의 자리 | 일의 자리 |
2¹ | 2⁰ | |
표2 |
가장 오른쪽의 비트
* 아래표는 5,028을 2진수로 표현한 표이다. * 가장 작은 유효 비트 (Least Significant Bit) -
LSB
2진수로 표현한 5,028 | |||||||||||||
2의 제곱 | 2¹² | 2¹¹ | 2¹⁰ | 2⁹ | 2⁸ | 2⁷ | 2⁶ | 2⁵ | 2⁴ | 2³ | 2² | 2¹ | 2⁰ |
2진수 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
10진수 | 4096 | 2048 | 1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
표3 |
가장 왼쪽의 비트 -자세한 설명은 아래 추가 설명에서-
가장 큰 유효 비트 (Most Significant Bit) - MSB
2진수 변환 결과는 다음과 같다.
수식 : 1 X 2¹² + 0 X 2¹¹ + 0 X 2¹⁰ + 1 X 2⁹ + 1 X 2⁸ + 1 X 2⁷ + 0 X 2⁶ + 1 X 2⁵ + 0 X 2⁴ + 0 X 2³ + 1 X 2² + 0 X 2¹ + 0 X 2⁰ = 5,028
※ 10진수로는 5,028이 네 자리 숫자라고 말할 수 있다. 2진수로는 5,028이 13비트 수가 된다.※
16비트 2진수로 저장한 5,028 <<------- LSB
0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
표4 |
MSB -------->>
10진수와 마찬가지로 가장 왼쪽에 있는 상자보다 더 왼쪽에 영(0)을 추가하면(이런 식으로 추가된 영들을 리딩제로 leading zero라고 말한다) 어떤 값을 표현하는 데 필요한 최소한의 상자 개수보다 더 많은 상자를 추가할 수 있다. 10진수에서 05,028과 5,028은 같은 값을 표현한다. 컴퓨터가 미리 정해진 수의 비트를 한 덩어리로 사용하도록 만들어졌기 때문데, 2진수를 쓸때는 이런 식으로 항상 일정한 개수의 비트를 사용해 값을 표현하는 경우가 종종 있다.
-추가 설명-
10진수를 2진수로 변환하는 방법
10진수 11을 2로 나눈 나머지를 2진수의 첫째자리에 오게 하고, 몫은 다시 2로 나누어 나머지를 2진수의 둘째자리에 오게하고 ... 마지막에 2미만이 된 몫을 2진수의 맨 왼쪽에 놓으면 된다.
2진수로 11은 1011이 된다.
잠깐!!!! QUIZ
→ 5,028을 2진수로 표현하면?
답은 2진수 '2진수로 표현한5,028' 표에서 확인가능하다.
2. 2진수 덧셈
10진 덧셈에서는 오른쪽(가장 작은 유효 숫자)에서 왼쪽으로 각 자리의 숫자를 서로 더한다. 결과가 9보다 크면 1을 올린다. 마찬가지로, 2진수에서도 각 비트를 LSB에서 MSB 쪽으로 더하며 결과가 1보다 크면 1을 다음 자리(왼쪽)로 올린다.
<------------------- 오른쪽 LSB부터 더한다.
1 | ⁰ 0 |
¹ 0 |
⁰ 1 |
5 | 1 | 0 | 1 |
6 | 1 | 1 | 0 |
표4 |
* 오른쪽 부터 1+1= 10에서 0을 내리고 1을 왼쪽으로 올린다. 2진수는 0과1만 표현되기 때문에 2라는 기호가 없고 1+1= 10으로 표현,
위로 올라간 수를 carry(오렌지색 숫자)라고한다.
논리연산을 사용한 2진 덧셈
<<< ------------------------------------------------ A, B 진행 방향 | ||||||
A | B | A AND B | A + B | A XOR B | A | B |
0 0 1 1 |
0 1 0 1 |
0 --- 0 --- 0 --- 1 --- |
--> 00 <-- --> 01 <-- --> 01 <-- --> 10 <-- |
--- 0 --- 1 --- 1 --- 0 |
0 0 1 1 |
0 1 0 1 |
표5-1 |
A AND B | 1 | 0 | 0 | 0 |
A |
( ¹ ↑) 1 |
( ⁰ ↑) 1 |
( ⁰ ↑) 0 |
( ⁰ ↑) 0 |
B | 1 | 0 | 1 | 0 |
A XOR B | 0 | 1 | 1 | 0 |
표5-2 |
추가
2진수의 뺄셈
2진수의 보수는 1의 보수와 2의 보수가 있다.
각각의 보수를 사용한 뺄셈
오버플로 overflow
덧셈 결과가 우리가 사용할 비트의 개수로 표현할 수 있는 범위를 벗어나면 어떻게 해야 할까? 이런 경우
오버플로 overflow 가 발생한다. 즉, MSB에서 올림이 발생했다.
1001(9₁₀) + 1000(8₁₀) = 10001(17₁₀)이된다. 하지만 4자리 비트라 1개가 부족하여 0001(1₁₀)가 되는 경우가 있다.
* 1001: 2진법 / (9₁₀): 10진법 9의10승
언더플로 underflow
MSB 위쪽에서 1을 빌려오는 경우.
산술연산의 결과가 취급할 수 있는 수의 범위 보다 작아지는 상태를 말한다.
3. 음수 표현
1). 부호와 크기
음수와 양수를 구별하기 위해 흔히 부호sign를 사용한다.
가장 왼쪽 MSB가 0이면 양부호(+), 1이면 음부호(-)라 한다.
2진수에서 4비트중 남은 3비트를 사용하면 0부터 7까지의 총15가지의 수를 표현할 수 있다.
(주의 양수 0과 음수 0은 똑같은 0이다. 16가지X.)
-부호와 크기 표현법
한 비트를 부호에 사용하고 나머지 비트를 수의 크기, 즉 0부터의 거리(절댓값)를 표현하기 위해 사용하는 방법
-문제점
① 0을 표현하는 방법이 두 가지라서 비트 구성에 비용이 낭비된다.
② 부호와 크기 표현법을 상용하면 XOR과 AND를 통한 덧셈 계산이 불가하다.
2진수 부호와 크기 표현법
부호 | 2² | 2¹ | 2⁰ | 10진수 | 부호 | 2² | 2¹ | 2⁰ | 10진수 |
0 | 1 | 1 | 1 | +7 | 1 | 0 | 0 | 0 | -0 |
0 | 1 | 1 | 0 | +6 | 1 | 0 | 0 | 1 | -1 |
0 | 1 | 0 | 1 | +5 | 1 | 0 | 1 | 0 | -2 |
0 | 1 | 0 | 0 | +4 | 1 | 0 | 1 | 1 | -3 |
0 | 0 | 1 | 1 | +3 | 1 | 1 | 0 | 0 | -4 |
0 | 0 | 1 | 0 | +2 | 1 | 1 | 0 | 1 | -5 |
0 | 0 | 0 | 1 | +1 | 1 | 1 | 1 | 0 | -6 |
0 | 0 | 0 | 0 | +0 | 1 | 1 | 1 | 1 | -7 |
표5 |
*4비트 음수, 양수의 부호만 다르고 남은 3비트 수 자체는 같다. 양수7 >111 / 음수7 > 111
부호와 크기 표현법을 사용한 덧셈표
+ | 0 | 0 | 0 | 1 | +1 |
1 | 0 | 0 | 1 | -1 | |
1 | 0 | 1 | 0 | -2 | |
표6 |
표를 보면 0001은 부호 비트가 0이기 때문에 1을 2진수로 표현한다. 1001은 부호 비트가 1이기 때문에 -1을 2진수로 표현한다. 이 두 수를 XOR과 AND를 사용한 산술 방식으로 계산하면 1010이 된다. 이 값을 10진수로 바꾸면 -2인데, -2는 +1과 -1을 더한 값이 아니다.
2). 1의 보수
- 양수의 모든 비트를 뒤집는 것
- NOT 연산을 통해 해결
문제점
1) 0을 두가지 방식으로 표현한다. (0이면 + , 1이면 - )
2) 덧셈을 쉽게 할 수 없다.
=> 해결법: MSB 쪽에서 올림이 발생한 경우 LSB로 올림을 전달해야 하는데 순환올림을 사용하면 되지만 복잡하고
순환올림을 처리 할 하드웨어를 추가해야 한다.
*순환올림 : +2와 -1을 더하면 0010 + 1110 는 일반 덧셈처럼 해서 10000인데 4비트 밖에 없기 때문에 MSB를 넘는 1을 LSB로 넘겨줘서 0001로 표현하는 것
¹ |
¹ 0 |
¹ 0 |
⁰ 1 |
0 |
+ 2 |
|
+ | 1 | 1 | 1 | 0 | - 1 | |
0 | 0 | 0 | 0 | 0 | ||
0 | 0 | 0 | 1 | 1 | 순환올림 | |
+ | 0 | 0 | 0 | 1 | + 1 | |
표7 |
** 현대 컴퓨터에서는 부호와 크기 표현법이나 1의 보수 표현법은 모두 사용하지 않는다. 이 두 방식을 사용한 계산은 추가적인 하드웨어 없이는 제대로 작동할 수 없고, 하드웨어를 추가해야 한다는 말은 비용이 더 든다는 뜻이기 때문이다.
이런 문제를해결하는 표현법을 살펴보자.
3). 2의 보수
- +1을 더했을 때 0이 나오는 비트 패턴을 찾고 그걸 -1이라고 하는 것을 말한다.
4비트 수의 경우 +1은 0001이다.
0001에 1111을 더하면 10000이고 2의 보수에서는 MSB의 올림 1을 버린다.
즉, 0000이 되므로 1111이 -1이되는 것이다.
2의 보수 표현법
+ 1 - 1 0 |
¹ 0 |
¹ 0 |
¹ 0 |
⁰ 1 |
1 | 1 | 1 | 1 | |
0 | 0 | 0 | 0 | |
표8 |
2의 보수 표현 법
1) 어떤 수의 비트를 구한다. (음수 양수 상관없음)
2) 그 비트에 NOT을 적용해서 뒤집는다.
3) LSB(1비트)에 1을 더한다.
위의 방법대로 해보면 숫자 +5를 4비트로 표현하면 0101인데 이걸 NOT을 적용하면 1010이고 여기에 1을 더하면
1011이다. 따라서 -5는 1011이다.
2진수 2의 보수
부호 | 2² | 2¹ | 2⁰ | 10진수 | 부호 | 2² | 2¹ | 2⁰ | 10진수 |
0 | 1 | 1 | 1 | +7 | 1 | 1 | 1 | 1 | -1 |
0 | 1 | 1 | 0 | +6 | 1 | 1 | 1 | 0 | -2 |
0 | 1 | 0 | 1 | +5 | 1 | 1 | 0 | 1 | -2 |
0 | 1 | 0 | 0 | +4 | 1 | 1 | 0 | 0 | -4 |
0 | 0 | 1 | 1 | +3 | 1 | 0 | 1 | 1 | -5 |
0 | 0 | 1 | 0 | +2 | 1 | 0 | 1 | 0 | -6 |
0 | 0 | 0 | 1 | +1 | 1 | 0 | 0 | 1 | -7 |
0 | 0 | 0 | 0 | +0 | 1 | 0 | 0 | 0 | -8 |
표9 |
잠깐!!!! QUIZ
→ +7을 2진수 2의 보수 표현법을 적용하면?
답은 +7찾는다 0111 > 뒤집는다 1000 > 1더한다 1001( 표9에서 -7확인!)
2의 보수에는 0이 1개의 역할만 가지고 있다.
0을 비트로 나타내면 0000이고 NOT을 적용하면 1111이다.
여기에 1을 더하면 10000인데 MSB 올림을 버리므로(오버플로-2진수 덧셈) 0000이 남는다.
0000은 0과 동일하므로 2의 보수에는 0이 1개의 역할만 가지고 있다.
비트의 개수가 커지면 표현 할 수 있는 값의 범위가 증가한다. 이번에 배운 내용 중에 우리가 같은 숫자로 이뤄진 수를 보더라도 표현 방식에 따라 값이 달라질 수 있다는 점을 꼭 염두에 둬야 한다.
2진수 1111은 2의 보수 에서는 -1이지만
부호와 크기 표기로는 -7이고
1의 보수 에서는 -0이다.
출처
*책 - 한 권으로 읽는 컴퓨터 구조와 프로그래밍
*블로그
10진수를 2진수로 변환, 2진수를 10진수로 변환 이렇게! | 의미 하나 (tistory.com)
*오버플로,언더플로
간단그린설명- https://codedragon.tistory.com/7948
자세한설명- https://blog-of-gon.tistory.com/90
* 2진수 덧셈과 2의 보수
https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=xxrcn11&logNo=20140446588
* 2진수 뺄셈
꿈꾸는느티나무 :: 2진법 연산 - 빼기 (tistory.com)
* 2진수의 보수별 뺄셈
[Digital design] 보수와 2진수의 덧셈과 뺄셈 (tistory.com)
'항해99 > CS 스터디팀 그라우해(6주)' 카테고리의 다른 글
항해 31일) CS- 6장 입출력과 네트워킹 ( ~ 아날로그를 디지털로 변환) (0) | 2022.02.09 |
---|---|
항해 27일) CS- 5장 컴퓨터 아키텍처와 운영체제: 메모리 계층과 성능, 코프로세서 (0) | 2022.02.05 |
항해 20일)CS- 3장 시간 표현과 상태기억 (순차 논리 회로) (0) | 2022.01.28 |
항해 15일)CS- 2장 디지털 컴퓨터의 사례 (0) | 2022.01.23 |