-
Bit
0 또는 1의 값을 가진다
-
Byte
8 비트이다(어떤 시스템에서는 16비트, 7비트로 사용하기도 함!)
0~255의 정수, 00~FF까지의 16진수를 표현 가능
-
Boolean
불린 연산을 말한다
- 집합 연산을 할 수 있다
00101011과 76543210을 대응시키면 {0,1,3,5}
교집합(and) 합집합(or) 여집합(not) 등
- 비트 연산을 할 수 있다
&&이 아닌 &, ||이 아닌 |, ^, ~를 사용해 정수 타입에 구현 가능
- 비트 시프트 연산
- x<<y left shift
x를 y칸 왼쪽으로;
왼쪽에 있던 비트는 삭제되고 오른쪽에는 0으로 채워진다
- x>>y right shift
오른쪽에 있던 비트는 삭제, 왼쪽에는
- unsigned면 0으로 채우고
- signed면 부호에 따라서 0 또는 1에 맞춰 채운다.
-
Encoding Integers
- Unsigned:
$B2U(X) = \sum\limits_{i=0}^{w-1} x_i \cdot 2^i$
UMin=0, UMax = $2^{n-1}$
- two’s complement (Signed)
$B2T(X) = - x_{w-1} \cdot 2^{w-1}+ \sum\limits_{i=0}^{w-2} x_i \cdot 2^i$
즉 맨 첫자리를 부호로 쓴다.
- -1은 1111…111로 쓰는 것을 주의
TMin = -2^(n-1)
TMax = 2^(n-1) -1
-
Extension
n비트 signed 정수를 n+k 비트로 확장하려면
sign bit를 왼쪽에 전부 똑같이 복사한다

-
사칙연산
-
덧셈
- 2의 보수는 더하면 0을 만들기 위해서 고안되었다.

- unsigned는 더하고 carry를 버린다.
→ 2^n보다 크면 2^n을 뺀다.
- 아벨군
- 덧셈에 닫혀 있음
- 교환법칙
- 결합법칙
- 항등원(0)
- 역원(2^n-x)

- signed는 더하고 carry를 버린다.
→ overflow 일어나면 음수로 간다.
- Unsigned의 덧셈과 동형 사상(isomorphic)
TAdd(u,v) = U2T[UAdd{T2U(u), T2U(v)}]
-
곱셈
-
비트 시프트 곱셈
- u<<k 하면 u * 2^k와 동일한 역할을 한다(signed, unsigned 전부 적용)
- 따라서 u<<5 - u<<3 == u * 24 이런식으로 응용가능하다!
곱셈을 shift로 자동으로 변환해 준다.
- logical shift
-
비트 시프트 나눗셈
- u>>k 하면 u를 2^k로 나눈 몫이 나온다
- 따라서 나누기도 비슷하게 응용할 수 있다!
- 정수 나눗셈을 하면 몫이 나오는 이유(5/2==2)
- 음수의 경우 ?
-
정수와 메모리

- Big-Endian: 낮은 주소에 msb
- little-endian: 낮은 주소에 lsb
x86은 little endian이다.
*x86이란? 인텔의 intel 8086에 적용된 아키텍처로, 32비트 CPU를 관용적으로 뜻함

-
String
- Array of ASCII characters
- final character should be \0 (null)
-
예제

- 1: x가 아주 작으면 overflow 돼서 0보다 큼
- 4: ux=0이면 -1이 1로 돼서 틀릴 수 있음
- 5: x=0, y=TMin 이면 -y가 정의가 안됨, 2의 보수를 취해도 TMin이 되므로 반례
- 6: 아주 큰 x면 overflow로 음수
- 7: 마찬가지로 overflow로 음수
- 9: x=TMin이면 -x = TMin
- 10: x=0이면 (00000|00000)<<5 == 00000으로 안된다
0이 아니면 성립한다.
- 12: 음수의 right bit shift의 경우는 왼쪽이 1로 채워지기 때문에 의도하지 않은 값을 내놓는다.
- 13: x=0: 0 & (-1) == 0 ≠ 0 (모순)