Skip to content

Commit

Permalink
feat: add two's complement post
Browse files Browse the repository at this point in the history
  • Loading branch information
MimmyJau committed Nov 16, 2023
1 parent 5151fc1 commit 54460e2
Showing 1 changed file with 42 additions and 0 deletions.
42 changes: 42 additions & 0 deletions src/pages/posts/twos-complement.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
---
layout: ../../layouts/MarkdownPostLayout.astro
title: "Two's Complement in 100 Seconds"
pubDate: "2023-11-16"
author: "MimmyJau"
description: "Key concepts in two's complement."
tags: ["architecture", "memory", "learning in public"]
---

If there's only one thing you need to understand about two's complement, it's the following:

> Negative numbers should have binary representations such that subtraction can be accomplished using the same algorithm as addition.
In order for this to work, the following is **sufficient**:

> For all $x$, let $\overline{x}$ be the binary value such that $x + \overline{x} = 0$ under binary addition. Then $\overline{x}$ is the binary representation of $-x$.
For example, knowing that
1) $0011_2$ has been defined as $3$, and [^binary]
2) $0011_2 + 1101_2 = 0000_2$,

it follows that $1101_2$ **must** be defined as $-3$.

Almost everything else about two's complement is a consequence of these ideas. For example, this explains why the common trick for multiply by $-1$ is to flip all the bits and add one.

## Why this works (optional reading)

To prove that this representation of negative numbers satisfies subtraction, we can prove the following two statements.

> Prove that the binary representation of each negative number is unique.
*Exercise left to the reader.*

> Let $\odot$ represent binary addition via two's complement. Prove that for any arbitrary $x$ and $y$, $x \odot (-y) = x - y$.
If $x >= 0$ and $y <= 0$, then the statement is directly applicable since $\odot \equiv +$ when both operands are non-negative numbers.

If both $x$ and $y$ are non-negative and $x >= y$, then $(x-y) \odot y = x - y + y = x$, where the first equality is true since binary addition of two positive number is simply addition. Applying $\odot \, (-y)$ to both sides we get $(x-y) \odot y \odot (-y) = x \odot (-y)$, with the left-hand side simplifying to $x - y \odot 0 = x - y$, satisfying the equality.

*The rest is left as an exercise to the reader.*

[^binary]: The subscript $2$ in $0101_2$ means this is a binary number.

0 comments on commit 54460e2

Please sign in to comment.