Binary Integers(2진수)
- electronic charge를 통해 컴퓨터의 메모리에 코드, 데이터를 저장함
- MSB : the most significant bit (가장 왼쪽에 있는 bit)
- LSB : the least significant bit (가장 오른쪽에 있는 bit)
- Signed or Unsigned
- Singed : Positive or negative
- Unsigned : Positive
- 0(Zero) : Postive Integer
Decimal을 Unsigned Binary로 변환하는 방법
- 특정 수를 2로 나눈 나머지들을 역순으로 나열한다
- ex) 37 % 2 = 1 / 18 % 2 = 0 / 9 % 2 = 1, 4 % 2 = 0 / 2 % 2 = 0 / 1 % 2 = 1 /
- 위 나머지를 역순으로 배치하면 2진수 100101이 된다
- 2진수로 표현하기 위한 자리 수를 계산하는 법
- log_2(n)의 정수 값 + 1
- or ceiling(log2(n))
- ex) log_2(37) : 5.xxx --> 표현하는데 6자리가 필요하다
- x자리로는 최대 (10진수) 2^x - 1 까지 표현 가능하기 때문
- log_2(n)의 정수 값 + 1
Unsigned Binary Addition
- 더할 때 발생하는 Carry는 next-highest bit에 더해주면 된다
- 최상위 bit에서 발생하는 Carry는 버린다(ex. 1111 1111 + 0000 0001 => 0000 0000)
- 표현할 수 있는 수의 range를 넘는 Overflow의 한 종류
Integer Storage Size
- X86 컴퓨터에 데이터의 기본 저장 단위는 byte(8 bit) 임
- Byte : 1 byte / Word : 2 byte / Doubleword : 4 byte / Quadword : 8 byte / Duble quadword : 16 byte
Hexadecimal Integer(16진수)
- 16 진수를 통해 큰 수의 2진수를 편하게 읽을 수 있음
- 16진수 각 자리는 4개의 bit를 표한할 수 있기 때문
- 2개의 16진수는 1byte를 표현할 수 있다
- 0001 0110 1010 0111 1001 0100은 16진수 16A794로 표현할 수 있다
Signed Binary Integers
- 양수 / 음수
- MSB(가장 왼쪽에 있는 bit)가 부호를 나타냄
- 0 : positive
- 1 : negative
2의 보수법(Two's-Complement Representaion)
- 음수를 나타내기 위해 2의 보수법을 사용함
- -A + A = 0 처럼, 합이 0임을 이용한 표기법
- 0은 1로, 1은 0으로 Inverse 한 뒤, 1을 더해주면 된다
- 0000 0001을 1111 1110으로 Inverse 한 후, 1을 더해 1111 1111로 표현한다(-1)
- 2의 보수법은 Processor 디자이너에게 유용함
- addition circuit과 subtraction circuit을 분리해서 따로 만들지 않아도 됨
- A - B는 A + (-B)의 덧셈으로 연산하면 되기 때문
- 16진수를 2의 보수법을 통해 나타내는 방법
- First, 부호를 확인
- 가장 왼쪽에 있는 수가 8 이상이면 음수
- 1000(16진수: 8) 부터는 음수이기 때문
- 가장 왼쪽에 있는 수가 8 이상이면 음수
- Second, 15에서 각 자리수를 빼주고, 1을 더해준다
- ex) 6A3D --> 95C3
- First, 부호를 확인
- Signed Binary를 Decimal로 표현하는 방법(2의 보수법을 활용)
- 최상위 bit가 0인 경우 --> 양수
- 최상위 bit가 1인 경우 --> 음수
- 음수를 2의 보수법을 통해 절대값을 구하고, 그 절대값에 (-) 부호를 붙여준다
- ex) 1111 0000 --> 0001 0000 --> 16 --> -16
- Signed Decimal을 Binary로 표현하는 방법(2의 보수법을 활용)
- 양수 --> 2로 나눈 나머지를 나열
- 음수 --> 절댓값을 2진수로 표현하고, 2의 보수법을 통해 표현하면 끝
- ex) -43 --> 43의 2진수 : 00101011 --> 2의 보수를 거쳐 11010101
- Signed Decimal을 Hexadecimal로 표현
- 양수 --> 16진수로 나눈 나머지를 나열
- 음수 --> 10진수를 2진수로 표현하는 과정과 유사함
- 절대값을 2진수로 표현하고, 2의 보수를 취한 후 4자리씩 읽어서 표현하면 된다
- -43의 경우 1101 0101이고, 이를 4자리씩 계산해 16진수 D5로 나타내면 된다
- Signed Hexadecimal을 Decimal로 표현
- 양수 --> 16의 거듭제곱의 합으로 구하면 됨
- 음수 --> 2의 보수를 취해 10진수로 표현하고, (-)를 붙여준다
Signed Binary Integer의 최대 / 최솟 값
- n 비트로 이루어진 SignedBinary Integer는 최상위 비트를 부호를 나타내는데 사용하므로 n-1 bit만 수를 표현하는데 사용한다
- 따라서 -2^n 부터 2^n - 1까지 표현할 수 있다
- ex) 8bit Signed Binary Integer의 경우 -128 ~ 127까지 표현 가능하다.
Binary Subtraction
- 2의 보수법을 이용해 뺄셈을 덧셈으로 접근할 수 있다.(컴퓨터의 계산 방식)
- 여유분의 extra bit가 있다면 뺄셈 과정에서 발생하는 carry는 무시한다
- 여유분의 extra bit가 없다면 Overflow 발생
Overflow
- 주어진 digit의 수로 나타낼 수 있는 범위를 넘어서는 수로 계산되는 경우, Overflow가 발생한다
- ex) Unsigned 1111 1111 + 0000 0001 --> 0000 0000 // 255 + 1 --> 0
- ex) Unsigned 0000 0000 - 0000 0001 --> 1111 1111 // 0 - 1 --> 255
- ex) Signed 0111 1111 + 0000 0001 --> 1000 0000 // 127 + 1 --> -128
- ex) Signed 1000 0000 - 0000 0001 --> 0111 1111 // -128 - 1 --> 127
- 표현할 수 있는 수의 최솟값에서 어떤 수를 빼는 경우 최댓값으로 넘어가거나, 최댓값에서 어떤 수를 더해 최솟값으로 넘어가는 경우 모두 Overflow라고 한다. (Underflow는 부동 소수점에서 flow를 이야기 할 때 사용되는 용어이다)
- Overflow는 두 수가 모두 양수이거나, 모두 음수인 경우에만 발생한다
- 두 Unsinged number가 더해지는 경우 MSB에서 Carry out이 발생하는 지 확인하면 Overflow의 여부를 확인할 수 있다
- 두 Signed number가 더해지는 경우 MSB는 부호를 나타내기 때문에, overflow의 여부를 나타내지 않는다
- Signed number에서는, sign bit의 carry in과 carry out을 비교해, 두 carry가 같지 않다면, overflow가 발생한 것으로 판단할 수 있다(XOR 연산).
- ex) 70 + 80
- 0100 0110 + 0101 0000 --> 1001 0110
- carry in : 1, carry out : 0
- carry in과 carry out이 다르므로, overflow가 발생함을 알 수 있다
- 0100 0110 + 0101 0000 --> 1001 0110
- ex) -70 - 80
- 1 0111010 + 1 0110000 --> 0 1101010
- carry in : 0, carry out : 1
- carry in과 carry out이 다르므로, overflow가 발생함을 알 수 있다
- 1 0111010 + 1 0110000 --> 0 1101010
- ex) 70 + 80
Character Storage
- 컴퓨터가 binary data만 저장한다면, 어떻게 character를 표현할까?
- character를 integer에 매핑한 character set을 사용한다
- 예전에는 character sets에 8 비트만을 사용했지만, 오늘날 ASCII character set은 고유한 7비트 정수가 각 character를 가리키고 있다.
- ANSI Character Set
- 8bit를 사용하는데, 처음 128개는 standard US keyboard의 글자와 symbol에 해당함
- 이후 128개는 interational alphabet, accents, currency symbols, fraction과 같은 special character를 나타냄
- Unicode Standard
- 주요 언어 뿐만 아니라 유럽 알파벳, 중동, 동아시아의 언어를 포함하고 있다.
- ASCII Strings
- String이라 불림
- 1개, 혹은 그 이상의 문자들의 sequence
- ASCII string은 ASCII codes를 포함하는 bytes들을 연속으로써 메모리에 저장된다
- null-terminated string은 문자들의 연속 뒤에, 0을 담고 있는 단일 바이트가 오는 문자열임