Study Hub

Foundations / Start here

C Bits Number Representation

같은 bit pattern도 width, signedness, memory order에 따라 다른 의미를 갖는다는 감각을 만드는 단원입니다.

Why This Matters

RO의 ISA, datapath, cache 문제는 모두 bit와 byte 위에서 움직입니다.

C pointer와 struct 문제는 byte-addressed memory와 type size를 함께 봐야 풀립니다.

Zweierkomplement와 overflow를 모르면 immediate, load extension, branch offset도 흔들립니다.

Beginner Story

bit pattern은 글자 모양이고 type은 읽는 문법입니다.

8-bit 11111111은 unsigned 문법에서는 255이고 signed Zweierkomplement 문법에서는 -1입니다.

memory는 byte 칸들의 줄입니다. address 하나는 word가 아니라 byte 하나를 가리킵니다.

Little-Endian은 여러 byte 값을 낮은 address부터 어떤 순서로 놓을지 정하는 약속입니다.

Glossary / Key Terms

  • bit0 또는 1 하나의 정보 단위입니다. Exam tip: bit width를 먼저 표시합니다.
  • byte8 bit 묶음입니다. Exam tip: RISC-V memory address는 byte 단위입니다.
  • unsigned모든 bit를 양의 자리값으로 읽는 정수 표현입니다. Exam tip: n bit range는 0부터 2^n-1입니다.
  • signed양수와 음수를 모두 표현하는 정수 해석입니다. Exam tip: RO에서는 보통 Zweierkomplement로 봅니다.
  • Zweierkomplement음수를 표현하는 two's complement 규칙입니다. Exam tip: range와 overflow까지 함께 확인합니다.
  • MSB가장 왼쪽의 큰 자리 bit입니다. Exam tip: signed에서는 sign bit 역할을 합니다.
  • LSB가장 오른쪽의 작은 자리 bit 또는 byte입니다. Exam tip: Little-Endian에서 낮은 address에 옵니다.
  • Endiannessmulti-byte 값을 memory byte lane에 놓는 순서입니다. Exam tip: numeric value 자체를 뒤집지 않습니다.
  • pointer arithmeticpointer가 가리키는 type의 크기 단위로 주소가 움직입니다. Exam tip: int pointer는 보통 4 byte씩 이동합니다.
  • sign extensionsigned 값을 넓힐 때 sign bit를 왼쪽으로 복사합니다. Exam tip: lb와 lbu 차이와 연결됩니다.

Step-by-Step Method

  1. 1. width 정하기4 bit, 8 bit, 12 bit immediate, 32 bit register 중 무엇인지 먼저 씁니다.
  2. 2. signedness 정하기unsigned인지 signed Zweierkomplement인지 정합니다.
  3. 3. range 확인표현 가능한 범위 밖이면 overflow나 truncation을 의심합니다.
  4. 4. memory이면 byte로 나누기word 값을 byte lane으로 쪼갠 뒤 Endianness를 적용합니다.

Visual Model

address 0x100078563412

Little-Endian: value 0x12345678 is stored least significant byte first.

sign6432168421

8-bit signed weights

bit7의 weight가 -128인 표입니다.

bit7 -128, bit6 64, bit5 32, bit4 16, bit3 8, bit2 4, bit1 2, bit0 1

Little-Endian byte lane

0x12345678이 78 56 34 12로 놓이는 memory table입니다.

0x1000 78, 0x1001 56, 0x1002 34, 0x1003 12

Interactive Visual

Bit and Endian Playground

8-bit signed/unsigned value and 32-bit byte order를 직접 바꿔 보세요.

ready

JavaScript가 켜져 있으면 이 영역이 조작 가능한 visual lab으로 바뀝니다.

Worked Examples

-37 만들기

Problem: 8-bit Zweierkomplement로 -37을 표현합니다.

  1. +37은 00100101입니다.
  2. invert하면 11011010입니다.
  3. 1을 더하면 11011011입니다.
  4. 가중치로 읽으면 -37입니다.

같은 pattern을 unsigned로 읽으면 219입니다.

Little-Endian 배치

Problem: 0x12345678을 address 0x1000에 저장합니다.

  1. byte로 12 34 56 78로 나눕니다.
  2. least significant byte는 78입니다.
  3. Little-Endian은 78 56 34 12 순서로 저장합니다.

register value는 0x12345678 그대로입니다.

Common Mistakes

  • 0xFF의 의미를 하나로 고정합니다.width와 signedness를 먼저 씁니다.
  • pointer 증가를 byte 증가로만 봅니다.sizeof pointed type을 곱합니다.
  • Endian이 bit를 뒤집는다고 생각합니다.byte order만 바뀐다고 분리합니다.

Active Recall

  • 8-bit signed range는 무엇인가Hint: -2^7부터 시작합니다.
    정답 확인

    -128..127입니다.

  • int pointer가 0x2000에서 3칸 이동하면Hint: sizeof(int)=4로 둡니다.
    정답 확인

    0x200C입니다.

  • Little-Endian에서 0xAABBCCDD의 첫 byte는Hint: least significant byte를 고릅니다.
    정답 확인

    0xDD입니다.

Exam Connection

Uebung C와 Uebung 0의 계산은 ISA encoding과 memory tracing의 전제입니다.

답안에서는 bit width, signedness, byte order를 명시하면 부분점수를 지키기 쉽습니다.

Source Grounding

Grounding entries are course-file and source-window hints for study. When a problem needs an exact page number, branch penalty, address, or formula convention, verify the cited PDF window before finalizing the answer.

Full beginner lecture

C Bits Number Representation

Intuition

컴퓨터 안에는 decimal 숫자나 minus sign이 그대로 들어가지 않습니다. register와 memory에는 정해진 폭의 bit pattern만 들어갑니다. 같은 11111111도 8-bit unsigned로 읽으면 255이고, 8-bit Zweierkomplement signed로 읽으면 -1입니다. 그래서 RO에서 가장 먼저 할 일은 값과 표현을 분리하는 것입니다.

Rule

항상 세 질문을 먼저 씁니다. 몇 bit인가. signed인가 unsigned인가. memory 문제인가 register 값 문제인가. n-bit unsigned range는 0..2^n-1입니다. n-bit Zweierkomplement range는 -2^(n-1)..2^(n-1)-1입니다. negative value는 같은 width 안에서 invert plus one으로 만들고, 더 큰 width로 옮길 때 signed value는 sign extension을 합니다.

Pointer arithmetic은 byte arithmetic이 아니라 element arithmetic입니다. int *p에서 p + 1은 보통 address + 4입니다. RISC-V memory는 byte-addressed이므로 실제 memory dump는 byte 단위로 봅니다. Little-Endian은 least significant byte를 가장 낮은 address에 저장한다는 규칙입니다.

Visual Block

8-bit Zweierkomplement weights

bit:    7      6    5    4    3   2   1   0
weight -128   64   32   16   8   4   2   1

pattern 1111 1011
signed  = -128 + 64 + 32 + 16 + 8 + 2 + 1 = -5
unsigned = 128 + 64 + 32 + 16 + 8 + 2 + 1 = 251
Little-Endian store of 0x12345678 at base 0x1000

address   byte
0x1000    0x78
0x1001    0x56
0x1002    0x34
0x1003    0x12

Register value is still 0x12345678.
Only the memory byte order changed.

Worked Example 1

Problem. Represent -37 as 8-bit Zweierkomplement and read the same pattern as unsigned.

  1. Write +37 as 8-bit binary. 37 = 32 + 4 + 1, so 0010 0101.
  2. Invert all bits. 1101 1010.
  3. Add one. 1101 1011.
  4. Check as signed. -128 + 64 + 16 + 8 + 2 + 1 = -37.
  5. Read the same pattern as unsigned. 128 + 64 + 16 + 8 + 2 + 1 = 219.

Answer. signed value -37 is 11011011 = 0xDB. The same 8 bits as unsigned mean 219.

Worked Example 2

Problem. int a[] starts at 0x1000, sizeof(int)=4. Find a[3] and store 0x12345678 there in Little-Endian order.

  1. Array address uses base + index * sizeof(element).
  2. a[3] = 0x1000 + 3*4 = 0x100C.
  3. Split the value into bytes from most significant to least significant. 12 34 56 78.
  4. Little-Endian puts least significant byte first.
  5. Memory becomes 0x100C:78, 0x100D:56, 0x100E:34, 0x100F:12.

Boolesche Logik와 Halb-/Volladdierer

입문자 연결

Bit 하나는 0 또는 1이고, logic gate는 입력 bit로 출력 bit를 만드는 작은 규칙입니다. Boolesche Logik를 계산할 때는 숫자의 크기보다 각 gate의 truth condition을 먼저 봅니다.

Gate / German term기호출력이 1인 조건
NOT / Negation¬A 또는 !AA가 0
AND / KonjunktionA ∧ BA와 B가 모두 1
OR / DisjunktionA ∨ B둘 중 하나 이상이 1
XOR / Exklusiv-ODERA ⊕ B두 입력이 서로 다름

XOR는 “둘 중 정확히 하나가 1”이라는 점이 addition과 연결됩니다. 두 1을 더하면 현재 bit의 Summe는 0이고 다음 자리로 carry 1이 나가기 때문입니다.

A B | A AND B | A OR B | A XOR B
0 0 |    0    |   0    |    0
0 1 |    0    |   1    |    1
1 0 |    0    |   1    |    1
1 1 |    1    |   1    |    0

Halbaddierer와 Volladdierer

Halbaddierer(Half Adder)는 두 bit A, B만 더합니다.

S = A XOR B
C = A AND B

S는 현재 자리 Summe, C는 다음 자리 Übertrag(carry)입니다. 이전 자리에서 들어오는 carry input이 없어서 “half”입니다.

Volladdierer(Full Adder)A, B, 이전 자리의 Cin 세 bit를 더합니다. Übung 0 Musterlösung의 최소 gate 구조처럼 중간값 P=A XOR B를 재사용하면:

P    = A XOR B
S    = P XOR Cin
Cout = (A AND B) OR (P AND Cin)
ABCinSCout
00000
00110
01010
01101
10010
10101
11001
11111

빠른 검산은 A+B+Cin = S + 2*Cout입니다. 예를 들어 1+1+1=3이고 출력 S=1, Cout=1이면 1+2=3이라 맞습니다.

Worked Trace: 4-bit ripple addition

0101₂ + 0011₂를 LSB(bit 0)부터 Volladdierer로 계산합니다. 첫 Cin=0입니다.

bitABCinSCout
011001
101101
210101
300110

아래 bit의 Cout가 바로 위 bit의 Cin이 됩니다. 결과 bit를 bit 3부터 읽으면 1000₂=8입니다. decimal 검산도 5+3=8입니다.

변형 문제

0111₂ + 0001₂를 같은 방식으로 더하고 각 carry를 쓰세요.

정답·검산 확인
bit 0: 1+1+0 -> S0=0, C1=1
bit 1: 1+0+1 -> S1=0, C2=1
bit 2: 1+0+1 -> S2=0, C3=1
bit 3: 0+0+1 -> S3=1, C4=0
result = 1000₂

검산: 7+1=8. Carry가 bit 0에서 생겨 bit 3까지 연쇄되는 것이 ripple carry입니다.

Active Recall

Q1. A=1, B=1인 Halbaddierer의 SC는 무엇인가요?

정답 확인

S=0, C=1입니다.

Q2. Volladdierer에 세 번째 입력 Cin이 필요한 이유는 무엇인가요?

정답 확인

낮은 자리 addition에서 나온 carry를 현재 자리에 더해야 하기 때문입니다.

Q3. Cout=(A AND B) OR ((A XOR B) AND Cin)을 말로 설명해 보세요.

정답 확인

A와 B가 둘 다 1이거나, A/B 중 하나만 1인 상태에서 Cin도 1이면 다음 자리 carry가 생긴다는 뜻입니다.

Q4. A+B+Cin = S+2*Cout 검산에서 오른쪽의 2가 필요한 이유는 무엇인가요?

정답 확인

Cout은 현재 자리보다 한 자리 높은 bit라서 현재 자리 값의 두 배 무게를 가지기 때문입니다.

근거: current:Uebung\Übung 0.pdf, pages 1-3의 Boolesche Logik와 Volladdierer 과제; current:Uebung\Übung 0 Musterlösung.pdf, pages 1-4의 truth table, XOR/AND/OR gate Volladdierer Lösung.

Common Mistakes

Active Recall

  1. What is the range of 8-bit unsigned and 8-bit signed Zweierkomplement.
  2. Read 1000 0000 as unsigned and as signed.
  3. If char *p=0x2000, what is p+3. If int *p=0x2000, what is p+3.
  4. Where is byte 0xEF stored for Little-Endian value 0xDEADBEEF at base 0x3000.

Source Grounding