[시스템프로그래밍]2장 정수의 표현(Data-Integer), 바이트 저장순서(Byte Ordering), 정수의 인코딩(B2U, B2T계산법), Signed와 Unsigned의 관계,
1장 복습
https://youknow301.tistory.com/106
[시스템프로그래밍] 1장 Computer System
컴퓨터 시스템의 계층도 Application programs Operating system Processor Main memory I/O devices Software: Application programs, Operating system Hardware: Processor, Main memory, I/O devices 컴퓨터 시스템 계층도는 위와 같이 되며
youknow301.tistory.com
요약:
- 컴퓨터 시스템은 하드웨어, 시스템 소프트웨어, 응용프로그램으로 구성
- 프로그램은 변역되어 변화함
- 프로그램은 시스템 프로그램 도움으로 하드웨어 실행
바이트 값의 인코딩(16진수, 10진수, 2진수)
Hex | Decimal | Binary |
0 | 0 | 0000 |
1 | 1 | 0001 |
2 | 2 | 0010 |
3 | 3 | 0011 |
4 | 4 | 0100 |
5 | 5 | 0101 |
6 | 6 | 0110 |
7 | 7 | 0111 |
8 | 8 | 1000 |
9 | 9 | 1001 |
A | 10 | 1010 |
B | 11 | 1011 |
C | 12 | 1100 |
D | 13 | 1101 |
E | 14 | 1110 |
F | 15 | 1111 |
컴퓨터의 워드길이 Machine Words
컴퓨터의 워드길이 Word size
정수의 값의 크기를 말한다
- 주소의 길이가 되기도 한다
대부분의 요즘 컴퓨터는 64비트(8바이트) 위드이다.
- 32비트 컴퓨터는 주소 범위가 4GB로 제한된다.
- 메모리가 많이 필요한 프로그램에서는 제약이 될 수 있다.
64비트 워드 컴퓨터
- 가용 주소 공간 1.8 x 10**19bytes(10의 19승)
- x86-64 컴퓨터는 48 비트 주소를 지원한다: 256 테라바이트
컴퓨터는 다양한 데이터 타입을 지원한다
- 워드의 일부분 또는 여러 워드 길이의 데이터 타입
- 모든 데이터 타입은 바이트의 배수를 길이로 갖는다.
워드 기반 메모리 구조
주소는 메모리에서 바이트의 위치를 지정
- 워드의 첫번째 바이트의 위치 지정
- 연속된 워드의 주소는 4(32비트 머신) 또는 8(64비트 머신)씩 증가
데이터 표시
C 데이터 타입 | 32-bit | 64bit | x86-64 |
char | 1 | 1 | 1 |
short | 2 | 2 | 2 |
int | 4 | 4 | 4 |
long | 4 | 8 | 8 |
float | 4 | 4 | 4 |
double | 8 | 8 | 8 |
long double | - | - | 10/16 |
pointer | 4 | 8 | 8 |
바이트 저장순서(Byte Ordering)
데이터는 어떤 순서로 저장이 되는가?
Sun, Mac, 인터넷 -> "Big Endian"
- LSB가 최대 주소의 위치에 저장
(x85, 안드로이드, IOS, Windows) ARM프로세서 -> "Little Endian"
- LSB가 최소 주소의 위치에 저장
Byte Ordering 예제
캐치패션 퀴즈를 풀면 현금처럼 사용 가능한 포인트 적립과 셀린느 선글라스 증정 이벤트에 응
deg.kr
전제 예시
변수 x가 다음과 같은 4비트 위드일때 0x1234567
x의 주소 &x는 현재 0x100이다.
Big Endian
-> Least significant byte(최하위 비트) 가 최대 주소에 저장됨
Little Endian
-> Least significant byte(최하위 비트) 가 최소 주소에 저장됨
비트연산자
연산자 | 연산자기능 |
& | 비트 AND연산을 진행한다. |
| | 비트 OR연산을 진행한다. |
^ | 비트 XOR연산을 진행한다. |
~ | 피연자의 비트를 1의 보수 취한다. |
<< | 비트를 왼쪽으로 이동시킨다 |
>> | 비트를 오른쪽으로 이동시킨다 |
쉬프트 연산
Left Shift: x << y
- 비트벡터 x를 왼족으로 y 위치만큼 이동(왼쪽에 있는 비트는 삭제)
- Log.(논리) 연산의 경우 오른쪽에는 0으로 채운다.
- Arith.(산술) 연산의 경우 최상위 비트를 복제한다.
Right Shift: x >> y
- 비트벡터 x를 오른족으로 y 위치만큼 이동(오른쪽에 있는 비트는 삭제)
- 오른쪽에는 0으로 채운다.
- Log.(논리) 연산의 경우 왼쪽에는 0으로 채운다.
- Arith.(산술) 연산의 경우 최상위 비트를 복제한다.
예시1
Argument x | 01100010 |
<< 3 | 00010000 |
Log. >> 2 | 00011000 |
Arith. >> 2 | 00011000 |
.
예시2
Argument x | 10100010 |
<< 3 | 00010000 |
Log. >> 2 | 00101000 |
Arith. >> 2 | 11101000 |
정수의 표현방법
부호가 없는 정수 Unsigned int
- 주어진 저장장소에 이진수로 표현
BCD 코드
- 4개 비트로 십진수 0~8표현
- 예) 2351(10) = 0010 0011 0101 0001 (BCD)
부호-크기 : MSB(최상위비트)에 의한 부호표시
예) -22(10) = 110110(2)
부호를 갖는 수의 표현 Signed
- 부호-크기, 1의 보수, 2의 보수로 표기가능
컴퓨터에서는 2의 보수로 부호형 정수를 표시하기로 정함
비부호형 수에서 2의 보수형 정수로 변환하는 방법
비트를 뒤집고 1을 더한다.
예시
정수의 인코딩
비부호형 정수
부호형 정수(2의 보수)
길이가 W비트인 정수의 표현 가능한 범위
비부호형 Unsigned Values
UMin = 0
UMax = 2**w - 1(2의 w제곱 -1)
2의 보수 Two's Complement values
TMin = -2**(w-1)
TMax = 2**(w-1) -1
-> 예시 w = 4 비트인 2의 보수의 범위는 -8 ~ 7
Singed 와 Unsigned 수의 비교
관찰
|TMin| = TMax + 1
UMax = 2 * TMax + 1
동일성
- 양수부분에 있어서는 signed와 unsigned의 표현이 동일
X | B2U(X) | B2T(X) |
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | 8 | -8 |
1001 | 9 | -7 |
1010 | 10 | -6 |
1011 | 11 | -5 |
1100 | 12 | -4 |
1101 | 13 | -3 |
1110 | 14 | -2 |
1111 | 15 | -1 |
Signed와 Unsigned 관계
캐치패션 퀴즈를 풀면 현금처럼 사용 가능한 포인트 적립과 셀린느 선글라스 증정 이벤트에 응
deg.kr
Signed와 Unsigned의 관계는 다음과 같다.
처음 보면 무슨 말인지 모를 수 있으나 예를 들어 보면 엄청 쉽다.
Signed x = -1일때 Unsigned의 값을 구해보자(T2U)
(아래(10)은 진수를 10진수를 말한다.)
Sx = -1 (10)
Sx = 1111(2)
Ux = 1111(2) = 15(10)
식에 의하면 x + 2**w = -1 + 16 = 15가 된다.
Signed x = 3일때 Unsigned의 값을 구해보자(T2U)
Sx = 3(10)
Sx = 0011(2)
Ux = 0011(2) = 3(10)
식에 의해 ux = x
C언어에서 signed, unsigned 변환
상수
- 아무 명시가 없으면 signed integers임
- 명시적으로 U를 숫자 끝에 붙이면 수식 전체가 Unsigned
타입변환 Casting
- 명시적으로 casting을 하는 경우
int tx, ty;
unsigned ux, uy;
tx = (int) ux;
uy = (unsigned) ty;
- 묵시적 캐스팅 Implicit casting을 이용할 수도 있다
tx = ux; //unsigned를 signed로 변환
uy = ty; //signed를 unsigned로 변환
Casting 충격
수식계산시:
- signed와 unsigned 값들이 한 개의 수식 내에 섞여 있는 경우 implicit 하게 unsigned로 바뀌어 진다.
- 비교연산자에서도 발생한다 <, >, ==, <=, >=
- Examples for W = 32 TMin = -2,147,483,648, TMax = 2,147,483,647
Constant1 | Constant2 | Relation | Evaluation |
0 | 0U | == | unsigned |
-1 | 0 | < | signed |
-1 | 0U | > | unsigned |
2147483647 | -2147483648 | > | signed |
2147483647U | -2147483648 | < | unsigned |
-1 | -2 | > | signed |
(unsigned) -1 | -2 | > | unsigned |
2147483647 | 2147483648U | < | unsgined |
2147483647 | (int) 21474833648U | > | signed |
위의 표를 쉽게 이해하는 방법이 있다.
1. 한 개의 수식에 unsigned가 있다면 두개 수식 모두 unsigned가 된다.(unsigned가 되면 부호가 없는 비트로 계산하면 된다. 즉 -1 -> 15로 계산하면된다 {signed와 unsigned 다시한번 확인하기} )
2. signed라면 그대로 두 수를 비교하면 된다.
즉. 위의 2147483647과 2147483647U 부분을 비교해보면 이해하기 쉽다
-> unsigned 에서 -2147483648은 앞의 수에 2**32를 하게된 값이 된다.