一、機器/系統相關
1.名稱表
8位(比特、bit) = 2字節(Byte)= 1字(WORD)【總線所說的“字”根據系統而不同】
1、位(比特)
位是計算機存儲的最小單位,簡記爲b,也稱爲比特(bit)計算機中用二進制中的0和1來表示數據,一個0或1就代表一位。位同時也是二進制數字中的位,是信息量的度量單位,爲信息量的最小單位;
2、字節
字節,英文Byte,是計算機用於計量存儲容量的一種計量單位,通常情況下一字節等於八位,字節同時也在一些計算機編程語言中表示數據類型和語言字符,在現代計算機中,一個字節等於八位;
3、字
字是表示計算機自然數據單位的術語,在某個特定計算機中,字是其用來一次性處理事務的一個固定長度的位(bit)組,在現代計算機中,一個字等於兩個字節。
除此之外還有 雙字DWORD、四字QWORD
2.尋址與字長
1.機器字長,是指CPU一次能處理數據的位數,通常與CPU的寄存器位數有關。
2.指令字長,計算機指令字的位數。指令字長取決於從操作碼的長度、操作數地址的長度和操作數地址的個數。不同的指令的字長是不同的。
3.存儲字長,是一個存儲單元存儲一串二進制代碼(存儲字),這串二進制代碼的位數稱爲存儲字長。
4.數據字長:計算機數據存儲所佔用的位數。
通常早期計算機:存儲字長 = 指令字長 = 數據字長。故訪問一次便可取一條指令或一個數據,隨着計算機應用範圍的不斷擴大,三者可能各不相同,但它們必須是字節的整數倍。
CPU按照其處理信息的字長可以分爲:8位微處理器、16位微處理器、32位微處理器、64位微處理器等。
CPU最大能查找多大範圍的地址叫做尋址能力,CPU的尋址能力以字節爲單位
如32位尋址的CPU可以尋址2的32次方大小的地址也就是4G,這也是爲什麼32位的CPU最大能搭配4G內存的原因,再多的話CPU就找不到了。
——原則上32位cpu是不能裝64位系統的(電腦已經很少有32位的cpu)
操作系統按照
32位操作系統支持的內存是2的32次方,也就是4GB內存。
64位操作系統理論上的尋址空間爲2的64次方bit,轉化單位爲2147483648GB。
3.編碼方式(亂碼產生的原因)
ASCII碼:一個英文字母(不分大小寫)佔一個字節的空間。一個二進制數字序列,在計算機中作爲一個數字單元,一般爲8位二進制數。換算爲十進制,最小值-128,最大值127。如一個ASCII碼就是一個字節。
UTF-8編碼:一個英文字符等於一個字節,一箇中文(含繁體)等於三個字節。中文標點佔三個字節,英文標點佔一個字節
Unicode編碼:一個英文等於兩個字節,一箇中文(含繁體)等於兩個字節。中文標點佔兩個字節,英文標點佔兩個字節
理解編碼的關鍵,是要把字符的概念和字節的概念理解準確。這兩個概念容易混淆,我們在此做一下區分:
概念描述 舉例
字符人們使用的記號,抽象意義上的一個符號。 ‘1’, ‘中’, ‘a’, ‘$’, ‘¥’ ……
字節計算機中存儲數據的單元,一個8位的二進制數,是一個很具體的存儲空間。0x01, 0x45, 0xFA……
字
在計算機中,一串數碼作爲一個整體來處理或運算的,稱爲一個計算機字,簡稱字。字通常分爲若干個字節(每個字節一般是8位)。在存儲器中,通常每個單元存儲一個字,因此每個字都是可以尋址的。字的長度用位數來表示。
在計算機的運算器、控制器中,通常都是以字爲單位進行傳送的。字在不同的地址出現其含義是不相同。例如,送往控制器去的字是指令,而送往運算器去的字就是一個數。
字符串
在內存中,如果“字符”是以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 有着統一的標準,它定義了世界上絕大多數的字符的編碼,使得拉丁文、數字、簡體中文、繁體中文、日文等都能以同一種編碼方式保存。
二、實踐:C語言程序。
1.存儲類型
在微型計算機中,通常用多少字節來表示存儲器的存儲容量。
在不同的系統上,這些類型佔據的字節長度是不同的:
short、int、long、char、float、double 這六個關鍵字代表C 語言裏的六種基本數據類型。
在32 位的系統上
char佔據的內存大小是1 個byte。
short佔據的內存大小是2 個byte;
int佔據的內存大小是4 個byte;
float佔據的內存大小是4 個byte;
double佔據的內存大小是8 個byte;
long int佔據的內存大小是4 個byte;
*可以用C語言關鍵字sizeof()來得到當前所佔有字節數。
其中的整形int、浮點float、無符號unsigned
雖然在字節長度是一樣的,但是存儲方式不同,取讀方式也不同,
詳見我的另一篇博客:c語言輸出0.000000或亂碼,深究
2.大端、小端(字節序)
大端模式Big Endian,是指數據的高字節保存在內存的低地址中,而數據的低字節保存在內存的高地址中,這樣的存儲模式有點兒類似於把數據當作字符串順序處理:地址由小向大增加,而數據從高位往低位放;這和我們的閱讀習慣一致。
小端模式Little Endian,是指數據的高字節保存在內存的高地址中,而數據的低字節保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低。
*注
因爲這張圖一塊內存即一個字節8位,放2個F(十六進制、4位、1111),
看這張圖時要把“01”、“23”、“45”、“67”看作 “一個個字,左右結構”
所以
1.小端時不會出現“76 54 32 10”
2.對多於一個字節的short、int、double等纔會出現網絡字節序、大小端字節序的問題。
判斷是否爲大端
bool IsBig_Endian()
//如果字節序爲big-endian,返回true;
//反之爲little-endian,返回false
{
unsigned short test = 0x1122;
if (*((unsigned char*)&test) == 0x11)
return 1;
else
return 0;
}//IsBig_Endian()
3.不同系統/機器/編譯器的字,所佔字節不同
總線一般被設計來傳輸固定大小的一塊數據,這塊數據被稱爲字(word),一個字包含的字節數(即字的大小)是各種計算機系統裏面的基本參數,而且這個參數在不同的系統裏通常是不同的。大多數的現代計算機系統裏面,一個字要麼是4個字節,要麼是8個字節.
由此我們可以看出,單純問一個字佔多少字節是沒有意義的,因爲字的大小取決去具體系統的總線寬度,如果是32位的系統(X86),則一個字是4個字節,如果是64位(X64),則是8個字節。
4.位端(位域)、位運算、結構體
位運算的時候,一些用到當前最大位的情況也需要知道
#include<stdio.h>
#define WORDSIZE 32 //我現在是X86模式編譯,佔32位,4字節(32位=4字節)
int main()
{
unsigned a, b, c;
int n;
printf("請輸入a和n \n");
scanf("%x,%d", &a, &n);
b = a << (WORDSIZE - n);//書中源碼這裏是16(字節),我運行發現總是不對,發現我現在是X86模式編譯,佔32位
c = a >> n;
c = c ^ b;
printf("a:%x \nc:%x", a, c);
printf("%d", IsBig_Endian());
return 0;
}
三、尺度單位(國際單位制單位前綴)
不同數量級間國際單位制(SI):
1KB=1024B;1MB=1024KB=1024×1024B。
國際電工委員會的電氣技術用字母符號標準IEC 60027-2IEC 80000-13
數據存儲是以10進製表示,數據傳輸是以2進製表示的,所以1KB不等於1000B。
1B(byte,字節)= 8 bit(見下文);
1KB(Kilobyte,千字節)=1024B= 2^10 B;
1MB(Megabyte,兆字節,百萬字節,簡稱“兆”)=1024KB= 2^20 B;
1GB(Gigabyte,吉字節,十億字節,又稱“千兆”)=1024MB= 2^30 B;
1TB(Terabyte,萬億字節,太字節)=1024GB= 2^40 B;
1PB(Petabyte,千萬億字節,拍字節)=1024TB= 2^50 B;
1EB(Exabyte,百億億字節,艾字節)=1024PB= 2^60 B;
1ZB(Zettabyte,十萬億億字節,澤字節)= 1024EB= 2^70 B;
1YB(Yottabyte,一億億億字節,堯字節)= 1024ZB= 2^80 B;
1BB(Brontobyte,一千億億億字節)= 1024YB= 2^90 B;
1NB(NonaByte,一百萬億億億字節) = 1024BB = 2^100 B;
1DB(DoggaByte,十億億億億字節) = 1024 NB = 2^110 B;
yotta Y 10008 10^24 1000000000000000000000000 Septillion Quadrillion 1991
zetta Z 10007 10^21 1000000000000000000000 Sextillion Trilliard 1991
exa E 10006 10^18 1000000000000000000 Quintillion Trillion 1975
peta P 10005 10^15 1000000000000000 Quadrillion Billiard 1975
tera T 10004 10^12 1000000000000 Trillion Billion 1960
giga G 10003 10^9 1000000000 Billion Milliard 1960
mega M 10002 10^6 1000000 Million 1960
kilo k 10001 10^3 1000 Thousand 1795
hecto h 10002⁄3 10^2 100 Hundred 1795
deca da 10001⁄3 10^1 10 Ten 1795
10000 10^0 1 One
deci d 1000−1⁄3 10^−1 0.1 Tenth 1795
centi c 1000−2⁄3 10^−2 0.01 Hundredth 1795
milli m 1000−1 10^−3 0.001 Thousandth 1795
micro µ 1000−2 10^−6 0.000001 Millionth 1960[2]
nano n 1000−3 10^−9 0.000000001 Billionth Milliardth 1960
pico p 1000−4 10^−12 0.000000000001 Trillionth Billionth 1960
femto f 1000−5 10^−15 0.000000000000001 Quadrillionth Billiardth 1964
atto a 1000−6 10^−18 0.000000000000000001 Quintillionth Trillionth 1964
zepto z 1000−7 10^−21 0.000000000000000000001 Sextillionth Trilliardth 1991
yocto y 1000−8 10^−24 0.000000000000000000000001 Septillionth Quadrillionth
東漢徐嶽所著的《數術記遺》中,就相當完整地記載了中國表示數量的數詞,由小到大依次爲一、十、百、千、萬、億(10·8)、兆(10·12)、京(10·16)、垓(10·20)、秭(10·24)、穰(10·28)、溝(10·32)、澗(10·36)、正(10·40)、載(10·44),此後隨着佛教的傳入和文化交流,又增加了極(10·48)、恆河沙(10·52)、阿僧只(10·56)、那由他(10·60)、不可思議(10·64)、無量(10·68)、大數(10·72)等,其中萬以下是十進位,萬以上則爲萬進位。
參考引用:
https://baike.baidu.com/item/字節
https://blog.csdn.net/weixin_34082177/article/details/86135393
http://bbs.gongkong.com/d/201504/613475_1.shtml
https://blog.csdn.net/guosir_/article/details/78346472
https://blog.csdn.net/hammer_xie/article/details/52301243
https://www.crifan.com/big_endian_big_endian_and_small_end_little_endian_detailed/
https://zhidao.baidu.com/question/1308113215598827339.html
https://www.cnblogs.com/ricksteves/p/9899893.html