2022-10-25 位、字節(jié)、字、尋址能力、編碼方式、大端小端

https://blog.csdn.net/sinat_27382047/article/details/104522170

不同系統(tǒng)/機(jī)器/編譯器的字,所占字節(jié)不同
總線一般被設(shè)計(jì)來(lái)傳輸固定大小的一塊數(shù)據(jù),這塊數(shù)據(jù)被稱為字(word),一個(gè)字包含的字節(jié)數(shù)(即字的大小)是各種計(jì)算機(jī)系統(tǒng)里面的基本參數(shù),而且這個(gè)參數(shù)在不同的系統(tǒng)里通常是不同的。大多數(shù)的現(xiàn)代計(jì)算機(jī)系統(tǒng)里面,一個(gè)字要么是4個(gè)字節(jié),要么是8個(gè)字節(jié).
由此我們可以看出,單純問(wèn)一個(gè)字占多少字節(jié)是沒(méi)有意義的,因?yàn)樽值拇笮∪Q去具體系統(tǒng)的總線寬度,如果是32位的系統(tǒng)(X86),則一個(gè)字是4個(gè)字節(jié),如果是64位(X64),則是8個(gè)字節(jié)。

一、機(jī)器/系統(tǒng)相關(guān)
1.名稱表
8位(比特、bit) = 2字節(jié)(Byte)= 1字(WORD)【總線所說(shuō)的“字”根據(jù)系統(tǒng)而不同】

1、位(比特)
位是計(jì)算機(jī)存儲(chǔ)的最小單位,簡(jiǎn)記為b,也稱為比特(bit)計(jì)算機(jī)中用二進(jìn)制中的0和1來(lái)表示數(shù)據(jù),一個(gè)0或1就代表一位。位同時(shí)也是二進(jìn)制數(shù)字中的位,是信息量的度量單位,為信息量的最小單位;
2、字節(jié)
字節(jié),英文Byte,是計(jì)算機(jī)用于計(jì)量存儲(chǔ)容量的一種計(jì)量單位,通常情況下一字節(jié)等于八位,字節(jié)同時(shí)也在一些計(jì)算機(jī)編程語(yǔ)言中表示數(shù)據(jù)類型和語(yǔ)言字符,在現(xiàn)代計(jì)算機(jī)中,一個(gè)字節(jié)等于八位;
3、字
字是表示計(jì)算機(jī)自然數(shù)據(jù)單位的術(shù)語(yǔ),在某個(gè)特定計(jì)算機(jī)中,字是其用來(lái)一次性處理事務(wù)的一個(gè)固定長(zhǎng)度的位(bit)組,在現(xiàn)代計(jì)算機(jī)中,一個(gè)字等于兩個(gè)字節(jié)。

除此之外還有 雙字DWORD、四字QWORD

2.尋址與字長(zhǎng)
1.機(jī)器字長(zhǎng),是指CPU一次能處理數(shù)據(jù)的位數(shù),通常與CPU的寄存器位數(shù)有關(guān)。
2.指令字長(zhǎng),計(jì)算機(jī)指令字的位數(shù)。指令字長(zhǎng)取決于從操作碼的長(zhǎng)度、操作數(shù)地址的長(zhǎng)度和操作數(shù)地址的個(gè)數(shù)。不同的指令的字長(zhǎng)是不同的。
3.存儲(chǔ)字長(zhǎng),是一個(gè)存儲(chǔ)單元存儲(chǔ)一串二進(jìn)制代碼(存儲(chǔ)字),這串二進(jìn)制代碼的位數(shù)稱為存儲(chǔ)字長(zhǎng)。
4.數(shù)據(jù)字長(zhǎng):計(jì)算機(jī)數(shù)據(jù)存儲(chǔ)所占用的位數(shù)。
通常早期計(jì)算機(jī):存儲(chǔ)字長(zhǎng) = 指令字長(zhǎng) = 數(shù)據(jù)字長(zhǎng)。故訪問(wèn)一次便可取一條指令或一個(gè)數(shù)據(jù),隨著計(jì)算機(jī)應(yīng)用范圍的不斷擴(kuò)大,三者可能各不相同,但它們必須是字節(jié)的整數(shù)倍。

CPU按照其處理信息的字長(zhǎng)可以分為:8位微處理器、16位微處理器、32位微處理器、64位微處理器等。
CPU最大能查找多大范圍的地址叫做尋址能力,CPU的尋址能力以字節(jié)為單位
如32位尋址的CPU可以尋址2的32次方大小的地址也就是4G,這也是為什么32位的CPU最大能搭配4G內(nèi)存的原因,再多的話CPU就找不到了。
——原則上32位cpu是不能裝64位系統(tǒng)的(電腦已經(jīng)很少有32位的cpu)
操作系統(tǒng)按照
32位操作系統(tǒng)支持的內(nèi)存是2的32次方,也就是4GB內(nèi)存。
64位操作系統(tǒng)理論上的尋址空間為2的64次方bit,轉(zhuǎn)化單位為2147483648GB。

3.編碼方式(亂碼產(chǎn)生的原因)
ASCII碼:一個(gè)英文字母(不分大小寫)占一個(gè)字節(jié)的空間。一個(gè)二進(jìn)制數(shù)字序列,在計(jì)算機(jī)中作為一個(gè)數(shù)字單元,一般為8位二進(jìn)制數(shù)。換算為十進(jìn)制,最小值-128,最大值127。如一個(gè)ASCII碼就是一個(gè)字節(jié)。
UTF-8編碼:一個(gè)英文字符等于一個(gè)字節(jié),一個(gè)中文(含繁體)等于三個(gè)字節(jié)。中文標(biāo)點(diǎn)占三個(gè)字節(jié),英文標(biāo)點(diǎn)占一個(gè)字節(jié)
Unicode編碼:一個(gè)英文等于兩個(gè)字節(jié),一個(gè)中文(含繁體)等于兩個(gè)字節(jié)。中文標(biāo)點(diǎn)占兩個(gè)字節(jié),英文標(biāo)點(diǎn)占兩個(gè)字節(jié)

理解編碼的關(guān)鍵,是要把字符的概念和字節(jié)的概念理解準(zhǔn)確。這兩個(gè)概念容易混淆,我們?cè)诖俗鲆幌聟^(qū)分:
概念描述 舉例
字符人們使用的記號(hào),抽象意義上的一個(gè)符號(hào)。 ‘1’, ‘中’, ‘a(chǎn)’, ‘$’, ‘¥’ ……
字節(jié)計(jì)算機(jī)中存儲(chǔ)數(shù)據(jù)的單元,一個(gè)8位的二進(jìn)制數(shù),是一個(gè)很具體的存儲(chǔ)空間。0x01, 0x45, 0xFA……


在計(jì)算機(jī)中,一串?dāng)?shù)碼作為一個(gè)整體來(lái)處理或運(yùn)算的,稱為一個(gè)計(jì)算機(jī)字,簡(jiǎn)稱字。字通常分為若干個(gè)字節(jié)(每個(gè)字節(jié)一般是8位)。在存儲(chǔ)器中,通常每個(gè)單元存儲(chǔ)一個(gè)字,因此每個(gè)字都是可以尋址的。字的長(zhǎng)度用位數(shù)來(lái)表示。
在計(jì)算機(jī)的運(yùn)算器、控制器中,通常都是以字為單位進(jìn)行傳送的。字在不同的地址出現(xiàn)其含義是不相同。例如,送往控制器去的字是指令,而送往運(yùn)算器去的字就是一個(gè)數(shù)。
字符串
在內(nèi)存中,如果“字符”是以ANSI編碼形式存在的,一個(gè)字符可能使用一個(gè)字節(jié)或多個(gè)字節(jié)來(lái)表示,那么我們稱這種字符串為ANSI字符串或者多字節(jié)字符串。如,“中文123” (占8字節(jié),包括一個(gè)隱藏的\0)。
字符集
對(duì)于ANSI編碼方式,存在不同的字符集(Charset)。同樣的字節(jié)序列,在不同的字符集下表示的字符不一樣。要正確解析一個(gè)ANSI字符串,還要選擇正確的字符集,否則就可能導(dǎo)致所謂的亂碼現(xiàn)象。不同語(yǔ)言版本的操作系統(tǒng),都有一個(gè)默認(rèn)的字符集。在不指定字符集的情況下,系統(tǒng)會(huì)使用此字符集來(lái)解析ANSI字符串。也就是說(shuō),如果我們?cè)诤?jiǎn)體中文版的Windows下打開了一個(gè)由日文操作系統(tǒng)保存的ANSI文本文件(僅包含ANSI字符串的文本文件),我們看到的將是亂碼。但是,如果我們使用Visual Studio之類的帶編碼選擇的文本編輯器打開此文件,并且選擇正確的字符集,我們將可以看到它的原貌。注意:簡(jiǎn)體中文字符集中的繁體字和繁體中文字符集中的繁體字,編碼不一定相同。
每個(gè)字符集都有一個(gè)確定的編號(hào),稱為代碼頁(yè)(Code Page)。簡(jiǎn)體中文(GB2312)的代碼頁(yè)為936,而系統(tǒng)默認(rèn)字符集的代碼頁(yè)為0,它表示根據(jù)系統(tǒng)的語(yǔ)言設(shè)置來(lái)選擇一個(gè)合適的字符集。
Unicode
字符串在內(nèi)存中,如果“字符”是以在Unicode中的序號(hào)存在的,那么我們稱這種字符串為Unicode字符串或者寬字節(jié)字符串。在Unicode中,每個(gè)字符都占兩個(gè)字節(jié)。如,“中文123”(占10字節(jié))。Unicode和ANSI的區(qū)別就相當(dāng)于輸入法內(nèi)的“全角”和“半角”的區(qū)別。
由于不同ANSI編碼所規(guī)定的標(biāo)準(zhǔn)是不相同的(字符集不同),因此,對(duì)于一個(gè)給定的多字節(jié)字符串,我們必須知道它采用的是哪一種字符集則,才能夠知道它包含了哪些“字符”。而對(duì)于Unicode字符串來(lái)說(shuō),不管在什么環(huán)境下,它所代表的“字符”內(nèi)容總是不變的。Unicode 有著統(tǒng)一的標(biāo)準(zhǔn),它定義了世界上絕大多數(shù)的字符的編碼,使得拉丁文、數(shù)字、簡(jiǎn)體中文、繁體中文、日文等都能以同一種編碼方式保存。

二、實(shí)踐:C語(yǔ)言程序。
1.存儲(chǔ)類型
在微型計(jì)算機(jī)中,通常用多少字節(jié)來(lái)表示存儲(chǔ)器的存儲(chǔ)容量。

在不同的系統(tǒng)上,這些類型占據(jù)的字節(jié)長(zhǎng)度是不同的:
short、int、long、char、float、double 這六個(gè)關(guān)鍵字代表C 語(yǔ)言里的六種基本數(shù)據(jù)類型。

在32 位的系統(tǒng)上
char占據(jù)的內(nèi)存大小是1 個(gè)byte。
short占據(jù)的內(nèi)存大小是2 個(gè)byte;
int占據(jù)的內(nèi)存大小是4 個(gè)byte;
float占據(jù)的內(nèi)存大小是4 個(gè)byte;
double占據(jù)的內(nèi)存大小是8 個(gè)byte;
long int占據(jù)的內(nèi)存大小是4 個(gè)byte;
*可以用C語(yǔ)言關(guān)鍵字sizeof()來(lái)得到當(dāng)前所占有字節(jié)數(shù)。

其中的整形int、浮點(diǎn)float、無(wú)符號(hào)unsigned
雖然在字節(jié)長(zhǎng)度是一樣的,但是存儲(chǔ)方式不同,取讀方式也不同,
詳見我的另一篇博客:c語(yǔ)言輸出0.000000或亂碼,深究

2.大端、小端(字節(jié)序)
大端模式Big Endian,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中,這樣的存儲(chǔ)模式有點(diǎn)兒類似于把數(shù)據(jù)當(dāng)作字符串順序處理:地址由小向大增加,而數(shù)據(jù)從高位往低位放;這和我們的閱讀習(xí)慣一致。

小端模式Little Endian,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中,這種存儲(chǔ)模式將地址的高低和數(shù)據(jù)位權(quán)有效地結(jié)合起來(lái),高地址部分權(quán)值高,低地址部分權(quán)值低。

*注
因?yàn)檫@張圖一塊內(nèi)存即一個(gè)字節(jié)8位,放2個(gè)F(十六進(jìn)制、4位、1111),
看這張圖時(shí)要把“01”、“23”、“45”、“67”看作 “一個(gè)個(gè)字,左右結(jié)構(gòu)”
所以
1.小端時(shí)不會(huì)出現(xiàn)“76 54 32 10”
2.對(duì)多于一個(gè)字節(jié)的short、int、double等才會(huì)出現(xiàn)網(wǎng)絡(luò)字節(jié)序、大小端字節(jié)序的問(wèn)題。

判斷是否為大端

bool IsBig_Endian()
//如果字節(jié)序?yàn)閎ig-endian,返回true;
//反之為little-endian,返回false
{
unsigned short test = 0x1122;
if (((unsigned char)&test) == 0x11)
return 1;
else
return 0;

}//IsBig_Endian()
1
2
3
4
5
6
7
8
9
10
11
3.不同系統(tǒng)/機(jī)器/編譯器的字,所占字節(jié)不同
總線一般被設(shè)計(jì)來(lái)傳輸固定大小的一塊數(shù)據(jù),這塊數(shù)據(jù)被稱為字(word),一個(gè)字包含的字節(jié)數(shù)(即字的大小)是各種計(jì)算機(jī)系統(tǒng)里面的基本參數(shù),而且這個(gè)參數(shù)在不同的系統(tǒng)里通常是不同的。大多數(shù)的現(xiàn)代計(jì)算機(jī)系統(tǒng)里面,一個(gè)字要么是4個(gè)字節(jié),要么是8個(gè)字節(jié).
由此我們可以看出,單純問(wèn)一個(gè)字占多少字節(jié)是沒(méi)有意義的,因?yàn)樽值拇笮∪Q去具體系統(tǒng)的總線寬度,如果是32位的系統(tǒng)(X86),則一個(gè)字是4個(gè)字節(jié),如果是64位(X64),則是8個(gè)字節(jié)。

4.位端(位域)、位運(yùn)算、結(jié)構(gòu)體
位運(yùn)算的時(shí)候,一些用到當(dāng)前最大位的情況也需要知道

include<stdio.h>

define WORDSIZE 32 //我現(xiàn)在是X86模式編譯,占32位,4字節(jié)(32位=4字節(jié))

int main()
{
unsigned a, b, c;
int n;
printf("請(qǐng)輸入a和n \n");
scanf("%x,%d", &a, &n);
b = a << (WORDSIZE - n);//書中源碼這里是16(字節(jié)),我運(yùn)行發(fā)現(xiàn)總是不對(duì),發(fā)現(xiàn)我現(xiàn)在是X86模式編譯,占32位
c = a >> n;
c = c ^ b;
printf("a:%x \nc:%x", a, c);

printf("%d", IsBig_Endian());
return 0;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
三、尺度單位(國(guó)際單位制單位前綴)
不同數(shù)量級(jí)間國(guó)際單位制(SI):
1KB=1024B;1MB=1024KB=1024×1024B。
國(guó)際電工委員會(huì)的電氣技術(shù)用字母符號(hào)標(biāo)準(zhǔn)IEC 60027-2IEC 80000-13
數(shù)據(jù)存儲(chǔ)是以10進(jìn)制表示,數(shù)據(jù)傳輸是以2進(jìn)制表示的,所以1KB不等于1000B。
1B(byte,字節(jié))= 8 bit(見下文);
1KB(Kilobyte,千字節(jié))=1024B= 2^10 B;
1MB(Megabyte,兆字節(jié),百萬(wàn)字節(jié),簡(jiǎn)稱“兆”)=1024KB= 2^20 B;
1GB(Gigabyte,吉字節(jié),十億字節(jié),又稱“千兆”)=1024MB= 2^30 B;
1TB(Terabyte,萬(wàn)億字節(jié),太字節(jié))=1024GB= 2^40 B;
1PB(Petabyte,千萬(wàn)億字節(jié),拍字節(jié))=1024TB= 2^50 B;
1EB(Exabyte,百億億字節(jié),艾字節(jié))=1024PB= 2^60 B;
1ZB(Zettabyte,十萬(wàn)億億字節(jié),澤字節(jié))= 1024EB= 2^70 B;
1YB(Yottabyte,一億億億字節(jié),堯字節(jié))= 1024ZB= 2^80 B;
1BB(Brontobyte,一千億億億字節(jié))= 1024YB= 2^90 B;
1NB(NonaByte,一百萬(wàn)億億億字節(jié)) = 1024BB = 2^100 B;
1DB(DoggaByte,十億億億億字節(jié)) = 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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容