簡介
位元組是二進制數據的單位。一個位元組通常8位長。但是,一些老型號計算機結構使用不同的長度。為了避免混亂,在大多數國際文獻中,使用詞代替byte。在多數的計算機系統中,一個位元組是一個8位長的數據單位,大多數的計算機用一個位元組表示一個字元、數字或其他字元。一個位元組也可以表示一系列二進制位。在一些計算機系統中,4 個位元組代表一個字,這是計算機在執行指令時能夠有效處理數據的單位。一些語言描述需要2個位元組表示一個字元,這叫做雙位元組字元集。一些處理器能夠處理雙位元組或單位元組指令。位元組通常簡寫為“B”,而位通常簡寫為小寫“b”,計算機存儲器的大小通常用位元組來表示。
換算
ASCII碼:一個英文字母(不分大小寫)占一個位元組的空間。一個
二進制數字序列,在
計算機中作為一個數字單元,一般為8位二進制數。換算為十進制,最小值-128,最大值127。如一個ASCII碼就是一個位元組。
UTF-8編碼:一個英文
字元等於一個位元組,一個中文(含繁體)等於三個位元組。中文標點占三個位元組,英文標點占一個位元組
Unicode編碼:一個英文等於兩個位元組,一個中文(含繁體)等於兩個位元組。中文標點占兩個位元組,英文標點占兩個位元組
不同數量級間
國際單位制(SI):
1KB=1024B;1MB=1024KB=1024×1024B。
1B(byte,位元組)= 8 bit(見下文);
1KB(Kilobyte,
千位元組)=
1024B= 2^10 B;
1
MB(Megabyte,
兆位元組,百萬位元組,簡稱“兆”)=1024KB= 2^20 B;
1
GB(Gigabyte,
吉位元組,十億位元組,又稱“千兆”)=1024MB= 2^30 B;
1
TB(Terabyte,萬億位元組,
太位元組)=1024GB= 2^40 B;
1
PB(Petabyte,千萬億位元組,
拍位元組)=
1024TB= 2^50 B;
1
EB(Exabyte,百億億位元組,
艾位元組)=
1024PB= 2^60 B;
1
ZB(Zettabyte,十萬億億位元組,
澤位元組)=
1024EB= 2^70 B;
1
YB(Yottabyte,一億億億位元組,
堯位元組)=
1024ZB= 2^80 B;
1
BB(Brontobyte,一千億億億位元組)=
1024YB= 2^90 B;
1NB(NonaByte,一百萬億億億位元組) =
1024BB = 2^100 B;
1DB(DoggaByte,十億億億億位元組) =
1024 NB = 2^110 B;
國際電工委員會的電氣技術用字母符號標準IEC 60027-2IEC 80000-13
數據存儲是以10
進制表示,數據傳輸是以2進制表示的,所以1KB不等於1000B。
1KB=1024B;1MB=1024KB=1024×1024B。其中1024=2。
1B(byte,位元組)= 8 bit(見下文);
1KiB(Kibibyte,
千位元組)=1024B= 2^10 B;
1
MiB(Mebibyte,
兆位元組,百萬位元組,簡稱“兆”)=1024KB= 2^20 B;
1
GiB(Gibibyte,
吉位元組,十億位元組,又稱“千兆位元組”)=1024MB= 2^30 B;
1TiB(Tebibyte,萬億位元組,
太位元組)=1024GB= 2^40 B;
1
PiB(Pebibyte,千萬億位元組,
拍位元組)=1024TB= 2^50 B;
1
EiB(Exbibyte,百億億位元組,
艾位元組)=1024PB= 2^60 B;
1ZiB(Zebibyte,十萬億億位元組,
澤位元組)= 1024EB= 2^70 B;
1YiB(Yobibyte,一億億億位元組,
堯位元組)= 1024ZB= 2^80 B;
由於混淆已經普遍化:
Megabyte往往可以指Mebibyte
Gigabyte往往可以是指Gibibyte
Terabyte往往可以指Tebibyte
Petabyte往往亦可以指Pebibyte
Exabyte往往亦可以指Exbibyte
Zettabyte往往亦可以指Zebibyte
Yottabyte往往亦可以指Yobibyte
存儲類型
以下以Visual Basic為例,講解各種數據類型所占位元組。
數據類型 | 儲存空間大小(單位:位元組) | 範圍 |
Byte(位元組型) | 1 | 0 - 255 |
Boolean(布爾型/邏輯型) | 2 | True 或 False |
Integer(整數型) | 2 | -32,768 ~ 32767 |
Long(長整形)
| 4 | -2,147,483,648 ~ 2,147,483,647 |
| 4 | 負數範圍: -3.402823E38 ~ -1.401298E-45 正數範圍: 1.401298E-45 ~ 3.402823E38
|
| 8 | 負數範圍: -1.797,693,134,862,32E308 ~ -4.940,656,458,412,47E-324 正數範圍: 4.940,656,458,412,47E-324 ~ 1.797,693,134,862,32E308
|
Currency (變比整形 / 貨幣類型)
| 8 | -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807
|
Decimal(十進制型) | 14 | 沒有小數點時: +/-79,228,162,514,264,337,593,543,950,335 有小數點時: +/-7.922,816,251,426,433,759,354,395,033,5 最小的非零值: +/-0.000,000,000,000,000,000,000,000,000,1
|
Date(時間日期型) | 8 | 100 年 1 月 1 日 ~ 9999 年 12 月 31 日 |
Object(對象型) | 4 | 任何 Object 引用 |
String (變長) | 10 | 長度從 0 到 大約 20 億 |
String (定長) | 10 | 長度從 1 到大約 65,400 |
Variant (數字) | 16 | 任何數字值,最大可達 Double 的範圍 |
Variant (字元) | 22 | 與字元串長度,變長 String 有相同的範圍 |
用戶自定義變數 | - | - |
任何數據類型的
數組都需要 20 個
位元組的記憶體空間,加上每一數組維數占 4 個位元組,再加上數據本身所占用的空間。數據所占用的記憶體空間可以用
數據元數目乘上每個元素的大小加以計算。例如,以 4 個 2
位元組之 Integer 數據元所組成的一維
數組中的數據,占 8 個位元組。這 8 個
位元組加上額外的 24 個位元組,使得這個
數組所需總記憶體空間為 32 個位元組。包含一
數組的 Variant 比單獨的一個數組需要多 12 個
位元組。
相關單位
B與bit
數據存儲是以“位元組”(Byte)為單位,數據傳輸大多是以“位”(bit,又名“比特”)為單位,一個位就代表一個0或1(即二進制),每8個位(bit,簡寫為b)組成一個位元組(Byte,簡寫為B),是最小一級的信息單位。
B與iB
1KiB(Kibibyte)=1024byte
1KB(Kilobyte)=1000byte
1MiB(Mebibyte)=1048576byte
1MB(Megabyte)=1000000byte
硬碟生產商是以GB(
十進制,即10的3次方=1000,如1MB=1000KB)計算的,而電腦(
作業系統)是以GiB(2進制,即2的10次方, 如1MiB=1024KiB)計算的,但是國內用戶一般理解為1MiB=1M=1024 KB, 所以為了便於中文化的理解,翻譯MiB為MB也是可以的。
同樣根據
硬碟廠商與用戶對於1MB大小的不同理解,所以好多160G的硬碟實際容量按
計算機實際的1MiB=1024KB算都不到160G,這也可以解釋為什麼新買的硬碟“缺斤短兩”並沒有它所標示的那么大。
數據類型
Byte數據類型(位元組型)用一個位元組(Byte)儲存,可區別256個數字,取值範圍:0到255。 Byte是從0-255的無符號類型,所以不能表示負數。
語言字元
效果等同於 unsigned char型
typedef unsigned char BYTE
定義一種新類型BYTE,它其實就是unsigned char
在VC++中,byte型數據的定義包含在windows.h頭檔案中,調用byte需要添加代碼#include <windows.h>
而在java中,byte是一個關鍵字
表示聲明了一個整形常量在內容中占用一個位元組
取值範圍是-128~127
易混概念辨析
字
在
計算機中,一串數碼作為一個整體來處理或運算的,稱為一個
計算機字,簡稱字。字通常分為若干個位元組(每個位元組一般是8位)。在
存儲器中,通常每個
單元存儲一個字,因此每個字都是可以
定址的。字的長度用位數來表示。
在
計算機的
運算器、
控制器中,通常都是以字為單位進行傳送的。字在不同的地址出現其含義是不相同。例如,送往控制器去的字是指令,而送往
運算器去的字就是一個數。
字長
計算機的每個字所包含的位數稱為
字長。根據
計算機的不同,
字長有固定的和可變的兩種。固定
字長,即字長度不論什麼情況都是固定不變的;可變字長,則在一定範圍內,其長度是可變的。
計算的
字長是指它一次可處理的
二進制數字的數目。
計算機處理數據的速率,自然和它一次能加工的位數以及進行運算的快慢有關。如果一台
計算機的字長是另一台計算機的兩倍,即使兩台計算機的速度相同,在相同的時間內,前者能做的工作是後者的兩倍。
理解編碼的關鍵,是要把
字元的概念和位元組的概念理解準確。這兩個概念容易混淆,我們在此做一下區分:
概念描述 舉例
字元人們使用的記號,抽象意義上的一個
符號。 '1', '中', 'a', '$', '¥' ……
位元組
計算機中存儲數據的單元,一個8位的
二進制數,是一個很具體的
存儲空間。0x01, 0x45, 0xFA……
字元串
在
記憶體中,如果“
字元”是以
ANSI編碼形式存在的,一個字元可能使用一個位元組或多個位元組來表示,那么我們稱這種字元串為
ANSI字元串或者多位元組字元串。如,"中文123" (占8位元組,包括一個隱藏的\0)。
字元集
對於ANSI編碼方式,存在不同的
字元集(Charset)。同樣的位元組序列,在不同的
字元集下表示的字元不一樣。要正確解析一個ANSI
字元串,還要選擇正確的
字元集,否則就可能導致所謂的
亂碼現象。不同語言版本的
作業系統,都有一個默認的
字元集。在不指定
字元集的情況下,系統會使用此字元集來解析ANSI字元串。也就是說,如果我們在簡體中文版的Windows下打開了一個由日文
作業系統保存的ANSI文本檔案(僅包含ANSI
字元串的文本檔案),我們看到的將是
亂碼。但是,如果我們使用
Visual Studio之類的帶編碼選擇的
文本編輯器打開此檔案,並且選擇正確的
字元集,我們將可以看到它的原貌。注意:簡體中文
字元集中的繁體字和
繁體中文字元集中的繁體字,編碼不一定相同。
每個
字元集都有一個確定的編號,稱為
代碼頁(Code Page)。簡體中文(GB2312)的代碼頁為936,而系統默認
字元集的代碼頁為0,它表示根據系統的語言設定來選擇一個合適的字元集。
Unicode
字元串在
記憶體中,如果“字元”是以在Unicode中的序號存在的,那么我們稱這種字元串為Unicode字元串或者寬位元組字元串。在Unicode中,每個
字元都占兩個位元組。如,"中文123"(占10位元組)。Unicode和ANSI的區別就相當於
輸入法內的“
全形”和“
半角”的區別。
由於不同ANSI編碼所規定的標準是不相同的(
字元集不同),因此,對於一個給定的多位元組字元串,我們必須知道它採用的是哪一種字元集則,才能夠知道它包含了哪些“字元”。而對於Unicode
字元串來說,不管在什麼環境下,它所代表的“字元”內容總是不變的。Unicode 有著統一的標準,它定義了世界上絕大多數的
字元的編碼,使得拉丁文、數字、簡體中文、繁體中文、日文等都能以同一種編碼方式保存。