二進位、十進位、十六進位怎麼換算?
二進位的每一位從右邊數起代表 1、2、4、8、16、32、64、128……,把是 1 的位數加起來就是十進位。例如 0100 0001 = 64 + 1 = 65。
十進位轉二進位,就從最大的 2 的次方開始扣:65 = 64 + 1,所以第 7 位和第 1 位是 1,其他是 0。
十六進位用 0~9 和 A~F 表示 0~15,剛好等於 4 個二進位位元。所以二進位每 4 位一組,一組換成一個十六進位數字就好:0100 0001 → 4、1 → 0x41。這也是韌體和資料手冊都用十六進位寫暫存器值的原因。
| 十進位 | 二進位 | 十六進位 | 十進位 | 二進位 | 十六進位 |
|---|---|---|---|---|---|
| 0 | 0000 | 0 | 8 | 1000 | 8 |
| 1 | 0001 | 1 | 9 | 1001 | 9 |
| 2 | 0010 | 2 | 10 | 1010 | A |
| 3 | 0011 | 3 | 11 | 1011 | B |
| 4 | 0100 | 4 | 12 | 1100 | C |
| 5 | 0101 | 5 | 13 | 1101 | D |
| 6 | 0110 | 6 | 14 | 1110 | E |
| 7 | 0111 | 7 | 15 | 1111 | F |
負數和二補數
電腦用二補數(two’s complement)存負數:把正數的每一位反過來再加 1。8 位元的 -1 是 1111 1111(0xFF),-128 是 1000 0000(0x80)。同一組位元,當成無號數是 255,當成有號數是 -1,看程式怎麼宣告。
上面的工具選了位元數之後,可以在十進位輸入負數,結果會列出「有號十進位」。各位元數的範圍:
| 位元數 | 無號範圍 | 有號範圍 | C 型別 |
|---|---|---|---|
| 8 | 0~255 | -128~127 | uint8_t/int8_t |
| 16 | 0~65,535 | -32,768~32,767 | uint16_t/int16_t |
| 32 | 0~4,294,967,295 | -2,147,483,648~2,147,483,647 | uint32_t/int32_t |
| 64 | 0~約 1.8 × 10¹⁹ | 約 ±9.2 × 10¹⁸ | uint64_t/int64_t |
ASCII 對照表
ASCII 用 0~127 代表英文字母、數字、標點和控制字元。0~31 和 127 是控制字元,例如 LF(換行,0x0A)、CR(歸位,0x0D)、ESC(0x1B);32 是空白(SP)。幾個好記的規則:數字 0~9 是 0x30~0x39,大寫 A 是 0x41,小寫 a 是 0x61,大小寫剛好差 0x20。
| 十進位 | 十六 | 字元 | 十進位 | 十六 | 字元 | 十進位 | 十六 | 字元 | 十進位 | 十六 | 字元 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 00 | NUL | 32 | 20 | SP | 64 | 40 | @ | 96 | 60 | ` |
| 1 | 01 | SOH | 33 | 21 | ! | 65 | 41 | A | 97 | 61 | a |
| 2 | 02 | STX | 34 | 22 | " | 66 | 42 | B | 98 | 62 | b |
| 3 | 03 | ETX | 35 | 23 | # | 67 | 43 | C | 99 | 63 | c |
| 4 | 04 | EOT | 36 | 24 | $ | 68 | 44 | D | 100 | 64 | d |
| 5 | 05 | ENQ | 37 | 25 | % | 69 | 45 | E | 101 | 65 | e |
| 6 | 06 | ACK | 38 | 26 | & | 70 | 46 | F | 102 | 66 | f |
| 7 | 07 | BEL | 39 | 27 | ' | 71 | 47 | G | 103 | 67 | g |
| 8 | 08 | BS | 40 | 28 | ( | 72 | 48 | H | 104 | 68 | h |
| 9 | 09 | HT | 41 | 29 | ) | 73 | 49 | I | 105 | 69 | i |
| 10 | 0A | LF | 42 | 2A | * | 74 | 4A | J | 106 | 6A | j |
| 11 | 0B | VT | 43 | 2B | + | 75 | 4B | K | 107 | 6B | k |
| 12 | 0C | FF | 44 | 2C | , | 76 | 4C | L | 108 | 6C | l |
| 13 | 0D | CR | 45 | 2D | - | 77 | 4D | M | 109 | 6D | m |
| 14 | 0E | SO | 46 | 2E | . | 78 | 4E | N | 110 | 6E | n |
| 15 | 0F | SI | 47 | 2F | / | 79 | 4F | O | 111 | 6F | o |
| 16 | 10 | DLE | 48 | 30 | 0 | 80 | 50 | P | 112 | 70 | p |
| 17 | 11 | DC1 | 49 | 31 | 1 | 81 | 51 | Q | 113 | 71 | q |
| 18 | 12 | DC2 | 50 | 32 | 2 | 82 | 52 | R | 114 | 72 | r |
| 19 | 13 | DC3 | 51 | 33 | 3 | 83 | 53 | S | 115 | 73 | s |
| 20 | 14 | DC4 | 52 | 34 | 4 | 84 | 54 | T | 116 | 74 | t |
| 21 | 15 | NAK | 53 | 35 | 5 | 85 | 55 | U | 117 | 75 | u |
| 22 | 16 | SYN | 54 | 36 | 6 | 86 | 56 | V | 118 | 76 | v |
| 23 | 17 | ETB | 55 | 37 | 7 | 87 | 57 | W | 119 | 77 | w |
| 24 | 18 | CAN | 56 | 38 | 8 | 88 | 58 | X | 120 | 78 | x |
| 25 | 19 | EM | 57 | 39 | 9 | 89 | 59 | Y | 121 | 79 | y |
| 26 | 1A | SUB | 58 | 3A | : | 90 | 5A | Z | 122 | 7A | z |
| 27 | 1B | ESC | 59 | 3B | ; | 91 | 5B | [ | 123 | 7B | { |
| 28 | 1C | FS | 60 | 3C | < | 92 | 5C | \ | 124 | 7C | | |
| 29 | 1D | GS | 61 | 3D | = | 93 | 5D | ] | 125 | 7D | } |
| 30 | 1E | RS | 62 | 3E | > | 94 | 5E | ^ | 126 | 7E | ~ |
| 31 | 1F | US | 63 | 3F | ? | 95 | 5F | _ | 127 | 7F | DEL |
常見問題
十六進位前面的 0x 是什麼意思?
0x 只是標示「這是十六進位」,不是數值的一部分,0x41 和 41h、$41 都是同一個數。C、Python、JavaScript 用 0x,組合語言常用 h 結尾。二進位則常用 0b 開頭。這個工具輸入時加不加都可以。
大端序和小端序有什麼不同?
多位元組的數字存到記憶體或送出去時,大端序(big-endian)先放最高的位元組,小端序(little-endian)先放最低的。0x12345678 用大端序是 12 34 56 78,小端序是 78 56 34 12。ARM Cortex-M(STM32)和 x86 是小端序,網路協定和很多感測器的暫存器是大端序。用邏輯分析儀或 UART 看到的位元組順序反過來時,多半就是這個原因。
中文字可以轉成 ASCII 嗎?
不行,ASCII 只有 128 個字元,沒有中文。現在網頁和多數程式用 UTF-8:英文字母和 ASCII 一樣是一個位元組,中文字通常是 3 個位元組,例如「你」是 E4 BD A0。舊系統用的 Big5 編碼不一樣,這個工具只支援 UTF-8。
為什麼數字 0 的 ASCII 碼是 48?
因為 ASCII 把 0~9 排在 0x30~0x39。從 UART 收到的字元 '7' 其實是 0x37,要減掉 0x30(或 '0')才會變成數字 7,這是寫韌體常見的錯誤。