位、字節、字、尋址能力、編碼方式、大端小端

一、機器/系統相關

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     100023     10^2      100     Hundred     1795    
deca      da    100013     10^1      10     Ten     1795    
                10000      10^0      1     One    
deci      d     100013    10^1     0.1     Tenth     1795    
centi     c     100023    10^2     0.01     Hundredth     1795    
milli     m     10001     10^3     0.001     Thousandth     1795    
micro     µ     10002     10^6     0.000001     Millionth     1960[2]    
nano      n     10003     10^9     0.000000001     Billionth     Milliardth     1960    
pico      p     10004     10^12    0.000000000001     Trillionth     Billionth     1960    
femto     f     10005     10^15    0.000000000000001     Quadrillionth     Billiardth     1964    
atto      a     10006     10^18    0.000000000000000001     Quintillionth     Trillionth     1964    
zepto     z     10007     10^21    0.000000000000000000001     Sextillionth     Trilliardth     1991    
yocto     y     10008     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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章