十六進位

**十六進位**（簡寫為 _hex_ 或下標 16）在數學中是一種逢 16 進 1 的進位制。一般用數位 0 到 9 和字母 A 到 F 表示，其中：A~F 相當於十進位的 10~15，這些稱作**十六進位數位**。

例如十進位數 57，在二進位寫作 111001，在 16 進位寫作 39。

現在的 16 進位則普遍應用在電腦領域，這是因為將 4 個位元（Bit）化成單獨的 16 進位數字不太困難。1 個位元組 (Byte) 可以表示成 2 個連續的 16 進位數字。可是，這種混合表示法容易令人混淆，因此需要一些字首、字尾或下標來顯示。

## 表示方式

不同電腦系統、程式語言對於 16 進位數值有不同的表示方式：

* Ada 與 VHDL 用所基於的「數位引證」把 16 進位數包起來，例如「16#5A3#」。（註：Ada 對整數和實數都可以使用從 1 到 16 中任何一個做為其基數。）而對於位元組向量，VHDL 使用字首 x 表示，例如，x"10"，對應的二進位碼為："00010000"。
* C 語言、C++、Shell、Python、Java 語言及其他相近的語言使用字首「0x」，例如「0x5A3」。開頭的「0」令解析器更易辨認數，而「x」則代表十六進位（就如「O」代表八進位）。在「0x」中的「x」可以大寫或小寫。對於字元量 C 語言中則以 x + 兩位十六進位數的方式表示，如 xFF。
  * C++11 引進了十六進位浮點型字面常數。例如：`0x1.2p10` 表示 （1+2/16）×210=115210。實際上，Visual C++ 一直以來使用的 C/C++ 語言標準庫函式 printf，`%a` 作為類型說明符來格式化輸出浮點型值即為上述格式。例如：`printf("%a",1152.0);`
  * C/C++ 在表示字元型字面常數時，可以用：
    * 十六進位跳脫序列：如 \x1abf4 ，可以使用任意多的十六進位數位，直至不是十六進位數位為止；
    * 16 位元的通用字元名（universe-character name）：\u 後面必須跟 4 個十六進位數位（不足四位前面用零補齊），表示 Unicode 中在 0 至 0xFFFF 之內的碼位（但不能表示 0xD800 到 0xDFFF 之內的碼點，Unicode 標準規定這個範圍內的碼位保留，不表示字元）；
    * 32 位元的通用字元名：\U 後面必須跟 8 個十六進位數位（不足八位前面用零補齊），表示 Unicode 中所有可能的碼位（除 0xD800 到 0xDFFF 之外）。
* 在 VB、MSX BASIC、Quick BASIC 和 FreeBASIC 中，使用字首「&H」來表示。
* 在 HTML，十六進位字元可以用「x」，例如 &#x5a3; 和 &#1443; 效果應該無異。
* Intel 的組合語言中用字尾「h」來標識 16 進位的數（若該數以字母起首，在前面會增加一個「0」）例如「0A3Ch」、「5A3h」
* 其他組譯器（AT&T、Motorola、6502），Pascal，Delphi 和某些 BASIC 的版本使用字首「$」，例如「$5A3」
* 亦有用 `X'5A3'` 這類表示方式的，如於 PL/I，COBOL 及 JCL 中。這亦是 IBM 裝載早期作業系統的大型電腦與小型機上最常用的資料格式。

由於表示方式沒有單一、已協定的標準，所以以上的表示方式都有被使用，有時甚至在同一份論文上會出現幾個不同的表示方式。但因為各方式之間沒有太大的分歧，所以即使混合使用也沒有構成問題。

其中最常用（或常見）表示十六進位數值的方式是將 '0x' 加在數位前，或在數位後加上小字 16。例如 0x2BAD 和 2BAD16 都是表示十進位的 11181（或 1118110）。

在網頁設計上十六進位是很常用的。HTML 和 CSS 使用十六進位的表示法來表示網頁上的特定顏色。使用 # 的符號來表示而非用個別的符號表示十六進位。24-bit 顏色可以用 #RRGGBB 的格式來表示，RR 是顏色中紅色成分的數值，GG 是顏色中綠色成分的數值，BB 顏色中藍色成分的數值。舉個例子，紅色的陰影是十進位 238,9,63 可以編成 #EE093F。參見 網頁顏色.

在 URL 的特殊字元亦是用 ASCII 中的十六進位，每位元組都有百份比符號（%）在前，例如： 空格就表示為 %20，而中文維基百科的首頁位址就是 http://zh.wikipedia.org/wiki/Wikipedia:% E9% A6%96% E9% A1% B5（頁面存檔備份，存於網際網路檔案館） （在一些現代的瀏覽器，如 Firefox 中，位址中十六進位編碼會被解碼成實際字元，所以在這些瀏覽器中中文維基百科的首頁位址顯示成 http://zh.wikipedia.org/wiki/Wikipedia: 首页（頁面存檔備份，存於網際網路檔案館） ）

### 表示方法表

此中 hex 帶入具體 16 進位數。

## 十六進位的分數

與其他進位系統一樣，十六進位的系統可以用來表達分數，而循環小數也是很常見的：

由於基數 16 是平方（42），所以與 10 進位相比 16 進位小數的餘數迴圈周期更加常見。十進位時當最簡分母包含不存在於基數的素因數時就會出現迴圈小數。而 16 進位時所有分母不是 2 的冪情況下都會表現為迴圈小數。

然而由於儲存上的方便，浮點小數在電腦上一般都會採用二進位。

## 十六進位的轉換

### 數學的計算方法

#### 十進位轉十六進位

採餘式定理分解，例如將 487710 轉成十六進位：

4877÷16=304...13(D)

304÷16=19...0

19÷16=1...3

這樣就計到 487710=130D16

 

### 編程中的函式

#### Visual Basic

* 十六進位轉換為十進位：十進位（Long 型）=CLng ("&H" & 十六進位數（String 型）)
* 十進位轉換為十六進位：十六進位數（String 型）=Hex$(十進位)

#### Javascript

Javascript 能以 toString () 函式來將十進位數字轉為其他任意進位格式（String 類型）

亦可用 parseInt () 函式將任意進位的字串轉為十進位數字

#### Python

調用 Python 內建 int () 函式把該字串轉為數字。以下為在 Python 直譯器編程環境下的操作示範：

* 把十六進位的字串轉為十進位數字：

　
: 255

* 把十進位數字轉換為以十六進位表示之字串，可調用內建的 hex () 函式：

　
: 0xff

* 調用 BinAscii 模組其中的 b2a\_hex () 函式，可把以 ASCII 編碼的文字以十六進位表示：

　
: 41

　
: 反之也可把以十六進位表示的文字，換成以 ASCII 編碼的文字：

　
: A

#### Perl

十進位轉十六進位：

十六進位轉十進位：

用例（類 UNIX 系統中）：
先進入以上檔案所在的資料夾，然後執行命令：

```
> ./10to16 100 512 789
100	= 0x64
512	= 0x200
789	= 0x315
> ./16to10 AB 5D9
0xAB	= 171
0x5D9	= 1497
```

## 外部連結

* 16 進位到 10 進位轉換線上 （頁面存檔備份，存於網際網路檔案館）
* 10 進位到 16 進位轉換 （頁面存檔備份，存於網際網路檔案館）
* 線上十六進位編碼解碼（頁面存檔備份，存於網際網路檔案館）