位元組

計算機存儲容量計量單位

位元組(Byte)是計算機信息技術用於計量存儲容量的一種計量單位,也表示一些計算機編程語言中的數據類型和語言字元。作為一個單位來處理的一個二進位數字串,是構成信息的一個小單位。最常用的位元組是八位的位元組,即它包含八位的二進位數。

一個位元組存儲8位無符號數,儲存的數值範圍為0-255。如同字元一樣,位元組型態的變數只需要用一個位元組(8位元)的內存空間儲存。

簡介


位元組是二進位數據的單位。一個位元組通常8位長。但是,一些老型號計算機結構使用不同的長度。為了避免混亂,在大多數國際文獻中,使用詞代替byte。在多數的計算機系統中,一個位元組是一個8位長的數據單位,大多數的計算機用一個位元組表示一個字元、數字或其他字元。一個位元組也可以表示一系列二進位位。在一些計算機系統中,4個位元組代表一個字,這是計算機在執行指令時能夠有效處理數據的單位。一些語言描述需要2個位元組表示一個字元,這叫做雙位元組字符集。一些處理器能夠處理雙位元組或單位元組指令。位元組通常簡寫為“B”,而位通常簡寫為小寫“b”,計算機存儲器的大小通常用位元組來表示。

換算


ASCII碼:一個英文字母(不分大小寫)佔一個位元組的空間。一個二進位數字序列,在計算機中作為一個數字單元,一般為8位二進位數。換算為十進位,最小值-128,最大值127。如一個ASCII碼就是一個位元組。
UTF-8編碼:一個英文字元等於一個位元組,一個中文(含繁體)等於三個位元組。中文標點佔三個位元組,英文標點佔一個位元組
Unicode編碼:一個英文等於兩個位元組,一個中文(含繁體)等於兩個位元組。中文標點佔兩個位元組,英文標點佔兩個位元組

不同數量級間

1KB=1024B;1MB=1024KB=1024×1024B。
1B(byte,位元組)=8bit(見下文);
1KB(Kilobyte,千位元組)=1024B=2^10B;
1MB(Megabyte,兆位元組,百萬位元組,簡稱“兆”)=1024KB=2^20B;
1GB(Gigabyte吉位元組,十億位元組,又稱“千兆”)=1024MB=2^30B;
1TB(Terabyte,萬億位元組,太位元組)=1024GB=2^40B;
1PB(Petabyte,千萬億位元組,拍位元組)=1024TB=2^50B;
1EB(Exabyte,百億億位元組,艾位元組)=1024PB=2^60B;
1ZB(Zettabyte,十萬億億位元組,澤位元組)=1024EB=2^70B;
1YB(Yottabyte,一億億億位元組,堯位元組)=1024ZB=2^80B;
1BB(Brontobyte,一千億億億位元組)=1024YB=2^90B;
1NB(NonaByte,一百萬億億億位元組)=1024BB=2^100B;
1DB(DoggaByte,十億億億億位元組)=1024NB=2^110B;
國際電工委員會的電氣技術用字母符號標準IEC60027-2IEC80000-13
數據存儲是以10進位表示,數據傳輸是以2進位表示的,所以1KB不等於1000B。
1KB=1024B;1MB=1024KB=1024×1024B。其中1024=2。
1B(byte,位元組)=8bit(見下文);
1KiB(Kibibyte,千位元組)=1024B=2^10B;
1MiB(Mebibyte,兆位元組,百萬位元組,簡稱“兆”)=1024KB=2^20B;
1GiB(Gibibyte,吉位元組,十億位元組,又稱“千兆位元組”)=1024MB=2^30B;
1TiB(Tebibyte,萬億位元組,太位元組)=1024GB=2^40B;
1PiB(Pebibyte,千萬億位元組,拍位元組)=1024TB=2^50B;
1EiB(Exbibyte,百億億位元組,艾位元組)=1024PB=2^60B;
1ZiB(Zebibyte,十萬億億位元組,澤位元組)=1024EB=2^70B;
1YiB(Yobibyte,一億億億位元組,堯位元組)=1024ZB=2^80B;
由於混淆已經普遍化:
kilobyte往往可以指kibibyte
Megabyte往往可以指Mebibyte
Gigabyte往往可以是指Gibibyte
Terabyte往往可以指Tebibyte
Petabyte往往亦可以指Pebibyte
Exabyte往往亦可以指Exbibyte
Zettabyte往往亦可以指Zebibyte
Yottabyte往往亦可以指Yobibyte

存儲類型

以下以VisualBasic為例,講解各種數據類型所佔位元組。
數據類型儲存空間大小(單位:位元組)範圍
Byte(位元組型)10-255
Boolean(布爾型/邏輯型)2True或False
Integer(整數型)2-32,768~32767
Long(長整形)4-2,147,483,648~2,147,483,647
Single
4
負數範圍:
-3.402823E38~-1.401298E-45
正數範圍:
1.401298E-45~3.402823E38
Double
(雙精度浮點型)
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(時間日期型)8100年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=1024KB,所以為了便於中文化的理解,翻譯MiB為MB也是可以的。
同樣根據硬碟廠商與用戶對於1MB大小的不同理解,所以好多160G的硬碟實際容量按計算機實際的1MiB=1024KB算都不到160G,這也可以解釋為什麼新買的硬碟“缺斤短兩”並沒有它所標示的那麼大。

數據類型


Byte數據類型(位元組型)用一個位元組(Byte)儲存,可區別256個數字,取值範圍:0到255。Byte是從0-255的無符號類型,所以不能表示負數。具體參照數據類型。

語言字元


效果等同於unsignedchar型
typedefunsignedcharBYTE
定義一種新類型BYTE,它其實就是unsignedchar
在VC++中,byte型數據的定義包含在windows.h頭文件中,調用byte需要添加代碼#include
而在java中,byte是一個關鍵字
表示聲明了一個整形常量在內容中佔用一個位元組
取值範圍是-128~127

易混概念辨析


在計算機中,一串數碼作為一個整體來處理或運算的,稱為一個計算機字,簡稱字。字通常分為若干個位元組(每個位元組一般是8位)。在存儲器中,通常每個單元存儲一個字,因此每個字都是可以定址的。字的長度用位數來表示。
在計算機的運算器控制器中,通常都是以字為單位進行傳送的。字出現在不同的地址其含義是不相同。例如,送往控制器去的字是指令,而送往運算器去的字就是一個數。
計算機的每個字所包含的位數稱為字長。根據計算機的不同,字長有固定的和可變的兩種。固定字長,即字長度不論什麼情況都是固定不變的;可變字長,則在一定範圍內,其長度是可變的。
計算的字長是指它一次可處理的二進位數字的數目。計算機處理數據的速率,自然和它一次能加工的位數以及進行運算的快慢有關。如果一台計算機的字長是另一台計算機的兩倍,即使兩台計算機的速度相同,在相同的時間內,前者能做的工作是後者的兩倍。
一般地,大型計算機的字長為32-64位,小型計算機為12-32位,而微型計算機為4-16位。字長是衡量計算機性能的一個重要因素。
在微型計算機中,通常用多少位元組來表示存儲器的存儲容量。
例如,在C++的數據類型表示中,通常char為1個位元組,int為4個位元組,double為8個位元組。
理解編碼的關鍵,是要把字元的概念和位元組的概念理解準確。這兩個概念容易混淆,我們在此做一下區分:
概念描述舉例
字元人們使用的記號,抽象意義上的一個符號。'1','中','a','$','¥'……
位元組計算機中存儲數據的單元,一個8位的二進位數,是一個很具體的存儲空間。0x01,0x45,0xFA……
字元串
在內存中,如果“字元”是以ANSI編碼形式存在的,一個字元可能使用一個位元組或多個位元組來表示,那麼我們稱這種字元串為ANSI字元串或者多位元組字元串。如,"中文123"(佔8位元組,包括一個隱藏的\0)。
字符集
對於ANSI編碼方式,存在不同的字符集(Charset)。同樣的位元組序列,在不同的字符集下表示的字元不一樣。要正確解析一個ANSI字元串,還要選擇正確的字符集,否則就可能導致所謂的亂碼現象。不同語言版本的操作系統,都有一個默認的字符集。在不指定字符集的情況下,系統會使用此字符集來解析ANSI字元串。也就是說,如果我們在簡體中文版的Windows下打開了一個由日文操作系統保存的ANSI文本文件(僅包含ANSI字元串的文本文件),我們看到的將是亂碼。但是,如果我們使用VisualStudio之類的帶編碼選擇的文本編輯器打開此文件,並且選擇正確的字符集,我們將可以看到它的原貌。注意:簡體中文字符集中的繁體字和繁體中文字符集中的繁體字,編碼不一定相同。
每個字符集都有一個唯一的編號,稱為代碼頁CodePage)。簡體中文(GB2312)的代碼頁為936,而系統默認字符集的代碼頁為0,它表示根據系統的語言設置來選擇一個合適的字符集。
Unicode
字元串在內存中,如果“字元”是以在Unicode中的序號存在的,那麼我們稱這種字元串為Unicode字元串或者寬位元組字元串。在Unicode中,每個字元都佔兩個位元組。如,"中文123"(佔10位元組)。
Unicode和ANSI的區別就相當於輸入法內的“全形”和“半形”的區別。
由於不同ANSI編碼所規定的標準是不相同的(字符集不同),因此,對於一個給定的多位元組字元串,我們必須知道它採用的是哪一種字符集則,才能夠知道它包含了哪些“字元”。而對於Unicode字元串來說,不管在什麼環境下,它所代表的“字元”內容總是不變的。Unicode有著統一的標準,它定義了世界上絕大多數的字元的編碼,使得拉丁文、數字、簡體中文、繁體中文、日文等都能以同一種編碼方式保存。

位元組順序


應該注意到,多位元組欄位中的值是按照大末尾(big-endian)順序規定的,具體來說就是最高位的位元組出現在高位,而低位的位元組出現在低位。這會引起工作在Intel平台上的程序員的迷感,因為在Intel的平台上。數據是按照小末尾(little-endian)順序存儲的,高位的位元組出現在低位。