上海設(shè)計(jì)網(wǎng)站開發(fā)日本疫情最新數(shù)據(jù)
追求本質(zhì),不斷進(jìn)步
本文由@睡覺待開機(jī)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處。
本內(nèi)容在csdn網(wǎng)站首發(fā)
歡迎各位點(diǎn)贊—評(píng)論—收藏
如果存在不足之處請(qǐng)?jiān)u論留言,共同進(jìn)步!
這里寫目錄標(biāo)題
- 一、空間的申請(qǐng)
- 1.變量定義
- 1.1變量定義的概念:
- 1.2變量定義的原因:
- 2.變量聲明
- 二、數(shù)據(jù)存入
- 1.轉(zhuǎn)換補(bǔ)碼
- 2.大小端存儲(chǔ)
- 3.截?cái)?/li>
- 4.取值范圍的問題
- 三、數(shù)據(jù)取出
- 1.大小端
- 2.自身類型
- 3.整型提升
- 練習(xí)題
前言:
本節(jié)博客繼續(xù)前篇內(nèi)容進(jìn)行續(xù)寫,我們著重探求有符號(hào)與無符號(hào)數(shù)的問題,探求整形在內(nèi)存中的存儲(chǔ)這一課題
一、空間的申請(qǐng)
1.變量定義
1.1變量定義的概念:
所謂變量定義,本質(zhì)上就是在內(nèi)存中開辟特定大小的空間(不做解釋,后文體會(huì))。
概念區(qū)分:初始化與賦值
(1)概念:
初始化:指的是變量與生俱來的內(nèi)容屬性
賦值:值的是變量后來放到該變量空間的內(nèi)容屬性
(2)特點(diǎn):
初始化只能進(jìn)行一次,賦值可以進(jìn)行多次
初始化具有先天性的含義,賦值有著后天的含義。
1.2變量定義的原因:
定義變量的原因在于開辟空間,暫時(shí)存儲(chǔ)數(shù)據(jù)
首先,我們需要明確的是計(jì)算機(jī)是彌補(bǔ)人類計(jì)算能力低下問題誕生的(這里并沒有貶低人類的意思,就是說人類跟計(jì)算機(jī)相比計(jì)算能力確實(shí)相對(duì)來說比較差)
之后,我們需要明白,我們?nèi)祟愑?jì)算時(shí)候是需要一步一步計(jì)算的,計(jì)算機(jī)也是需要進(jìn)行先后計(jì)算了,并不是一下子就對(duì)所有數(shù)據(jù)進(jìn)行處理,計(jì)算機(jī)也是對(duì)一個(gè)一個(gè)數(shù)據(jù)進(jìn)行依次處理的,至于為什么算個(gè)數(shù)字那么快,因?yàn)橛?jì)算機(jī)算的快而已,這并不是說計(jì)算機(jī)對(duì)所有數(shù)據(jù)進(jìn)行同時(shí)處理。(注:當(dāng)然計(jì)算機(jī)也是可以同時(shí)對(duì)數(shù)據(jù)進(jìn)行處理的,不過同時(shí)處理數(shù)據(jù)的能力有限,了解即可)
然后,我們大概就明白了,為何需要變量?就是因?yàn)橛行?shù)據(jù)需要等待一些時(shí)間去讓計(jì)算機(jī)處理,在處理之前,需要先存儲(chǔ)起來防止數(shù)據(jù)丟失,這大概跟人類做運(yùn)算時(shí)候要寫在紙上差不多,省的忘了原來的數(shù)據(jù),如果忘了那就慘了。
那為啥需要把數(shù)據(jù)放在一個(gè)個(gè)變量里進(jìn)行處理啊?我數(shù)據(jù)直接放那一團(tuán)不就行了嘛,這有點(diǎn)類似于我們吃飯,我們一般都是用碗吃飯,而不是直接用鍋,原因在于效率高,計(jì)算機(jī)也是一樣,在處理數(shù)據(jù)的時(shí)候,先用變量把在“一鍋里的”數(shù)據(jù)分到一個(gè)個(gè)小碗里,然后就“吃”的快了。而且之前講過,我們做飯的地方跟我們吃飯的地方離得距離是比較遠(yuǎn)的,類似于硬盤中的程序跟cpu處理是比較遠(yuǎn)的,要想提高效率,就是借助變量變成“小碗”送到內(nèi)存當(dāng)中,這樣就跟cpu離得近了。其實(shí)我感覺變量就是起到了一個(gè)方便讀取數(shù)據(jù)的作用。
變量定義的本質(zhì)在于,開辟一塊內(nèi)存空間,暫時(shí)存儲(chǔ)數(shù)據(jù)
2.變量聲明
變量聲明的本質(zhì)就是:告知編譯器。**
兩者的區(qū)別在于,
聲明你可以聲明多次,定義只能定義一次哈。
本質(zhì)區(qū)別在于定義開辟內(nèi)存空間,變量聲明沒有開辟內(nèi)存空間。
這個(gè)區(qū)別有一個(gè)比較有意思的比喻,大概是這樣的,變量的定義類似于你跟你女朋友表白,只能表白一次吧?哈哈。然后變量的聲明的話就是你告訴你周圍的人,那個(gè)女孩是我女朋友哈,你們不要有非分之想了哈。這里想說聲明可以聲明無數(shù)次。(這里只是做一個(gè)比喻說明一下哈,無任何不良誘導(dǎo))
二、數(shù)據(jù)存入
首先同學(xué)們,我想問int a = -10;計(jì)算機(jī)會(huì)直接把-10存入內(nèi)存中嗎?答案是不是
原因在于計(jì)算機(jī)只認(rèn)識(shí)二進(jìn)制。
因而就需要進(jìn)制轉(zhuǎn)換,需要把-10這一個(gè)十進(jìn)制數(shù)字轉(zhuǎn)換成為二進(jìn)制的形式,這就牽扯到了原碼、反碼以及補(bǔ)碼的概念和轉(zhuǎn)換問題。
1.轉(zhuǎn)換補(bǔ)碼
有符號(hào)數(shù):
首先,對(duì)于有符號(hào)數(shù),一定要能表示該數(shù)據(jù)是正數(shù)還是負(fù)數(shù),所以我們一般用最高比特位來充當(dāng)符號(hào)位。
原碼反碼補(bǔ)碼都有符號(hào)位和數(shù)值位。符號(hào)位0表示正數(shù),1表示負(fù)數(shù),而三種表示方法各不相同。
無符號(hào)數(shù):
不需要轉(zhuǎn)換,原碼反碼補(bǔ)碼相同不存在符號(hào)位。
如果一個(gè)數(shù)據(jù)是負(fù)整數(shù),那么要遵守下面的規(guī)則進(jìn)行轉(zhuǎn)換:
原碼:直接將數(shù)字按照正負(fù)數(shù)的形式翻譯成二進(jìn)制即可
反碼:符號(hào)位不變,數(shù)值位按位取反
補(bǔ)碼:反碼+1
無符號(hào)數(shù):不需要轉(zhuǎn)換(原碼反碼補(bǔ)碼相同),沒有符號(hào)位的概念
整形:數(shù)據(jù)存放內(nèi)存中的其實(shí)是補(bǔ)碼
為啥需要補(bǔ)碼來存儲(chǔ)整形類型?
原因在于:
1.使用補(bǔ)碼,可以將符號(hào)位和數(shù)值位進(jìn)行統(tǒng)一處理,并且加法和減法也可以統(tǒng)一進(jìn)行處理
2.原碼與補(bǔ)碼的相互轉(zhuǎn)換,其運(yùn)算過程是相同的(都是取反+1),不需要格外的硬件電路
我需要強(qiáng)調(diào)一點(diǎn)的是,右邊數(shù)字的二進(jìn)制轉(zhuǎn)換與左邊的類型沒有半毛錢關(guān)系,編譯器判斷有無符號(hào)整形,只看你賦值的數(shù)字有沒有+號(hào)或者-號(hào)而已
那同學(xué)覺得計(jì)算機(jī)就這樣把補(bǔ)碼扔到內(nèi)存了嗎?
顯然不只如此!還需要考慮大小端存儲(chǔ)問題。
2.大小端存儲(chǔ)
大小端存儲(chǔ)取決于硬件單元,這個(gè)大小端存儲(chǔ)是啥意思呢?
大小端存儲(chǔ)的概念:
大端:低權(quán)值數(shù)字放到高地址處,高權(quán)重?cái)?shù)字放到低地址處。
小端:低權(quán)值數(shù)字放到低地址處,高權(quán)值數(shù)字放到高地址處。
3.截?cái)?/h3>
考慮到怎么存儲(chǔ)之后,我們還得需要考慮一個(gè)問題,就是會(huì)不會(huì)發(fā)生截?cái)?#xff1f;比如你把一個(gè)數(shù)字放到一個(gè)char類型里面,char類型只有8個(gè)比特位,存不下一個(gè)數(shù)字的32個(gè)比特位,必然要發(fā)生截?cái)?/strong>。
當(dāng)然對(duì)于截?cái)鄦栴},只是順便一提,有興趣可以單獨(dú)去研究一下。
4.取值范圍的問題
一個(gè)類型有取值范圍,那你知道取值范圍是怎么進(jìn)行確定的嗎?
一個(gè)類型的取值范圍的大小取決于這個(gè)類型有多少個(gè)比特位
假如我只給你一個(gè)比特位,請(qǐng)問你可以表示幾個(gè)數(shù)字(不考慮符號(hào)位)?
就倆數(shù)字(2^1)嘛,一個(gè)0一個(gè)1嘛
我如果給你兩個(gè)比特位呢?
4(2^2)個(gè)數(shù)字,00,01,10,11
我如果給你三個(gè)比特位呢?
8(2^3)個(gè)數(shù)字,000,001,010,011,100,101,110,111
……
所以,,,一個(gè)8個(gè)比特位的char類型,可以表示幾個(gè)數(shù)字?2^8==256!
這也就解釋char(有符號(hào))類型的取值范圍是-128—127了。
但是我有個(gè)小疑惑,-128靠8個(gè)比特位是怎么表示出來的?明明需要9個(gè)比特位啊。
只是人為規(guī)定!!!
之后呢,還要給大家看一個(gè)取值循環(huán)圖,大家就能明白類型的取值范圍是怎么回事了:
三、數(shù)據(jù)取出
1.大小端
還是要先看大小端問題,小端存儲(chǔ)就小端取出,大端存儲(chǔ)就大端取出即可。
2.自身類型
到了這個(gè)時(shí)候,說實(shí)在的左邊的類型才有作用,什么意思呢?左邊的類型決定了怎么看待這串二進(jìn)制數(shù)字。
比如說左邊如果是無符號(hào)整形類型,那么就不會(huì)把二進(jìn)制最高位看成符號(hào)位,同理,如果是有符號(hào)類型,就會(huì)把最高位的二進(jìn)制位看成符號(hào)位,這兩種情況是截然不同的數(shù)值!
3.整型提升
如果我在內(nèi)存里面是一個(gè)8個(gè)比特位的字符呢?你放入的類型卻是一個(gè)int類型怎么辦?整型提升。有符號(hào)int補(bǔ)符號(hào)位,無符號(hào)int前面補(bǔ)0,給你補(bǔ)到32個(gè)比特位再說。當(dāng)然,這個(gè)地方也就不細(xì)說了,有興趣可以自行研究一下。
練習(xí)題
最后送大家一道練習(xí)題哈,如果看完本文章大體理解我說的啥的話,應(yīng)該可以做對(duì),當(dāng)然不對(duì)的話也不要擔(dān)心哈,再弄懂就好啦,知識(shí)不是一下就會(huì)弄懂的。
int main()
{char a[1000];int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;}printf("%d", strlen(a)); return 0;
}
答案:255,請(qǐng)?jiān)嚪治霰绢}。
解析:略。