最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

C/C++編程知識(shí):整型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)!講解+示例

2021-08-02 18:57 作者:C語(yǔ)言編程__Plus  | 我要投稿



1.整型的歸類

char

short

int

long

以上都分為有符號(hào)(signed)與無(wú)符號(hào)(unsigned)的類型

2.原碼、反碼和補(bǔ)碼

2.1 定義

計(jì)算機(jī)在表示一個(gè)數(shù)字時(shí),是采用二進(jìn)制的方式,所以為了準(zhǔn)確表示一個(gè)數(shù)的正負(fù),每一個(gè)有符號(hào)數(shù)都將其最高位視作是符號(hào)位,最高位為0表示正數(shù),最高位為1表示負(fù)數(shù)。我們接下來(lái)以有符號(hào)整型int的數(shù)字進(jìn)行分析。

一個(gè)有符號(hào)整數(shù)由?符號(hào)位?+?數(shù)值位?組成,數(shù)值位是其最高位,分別以0/1表示正/負(fù)

對(duì)于正數(shù)來(lái)說(shuō),反碼補(bǔ)碼都與原碼相同;

對(duì)于負(fù)數(shù)來(lái)說(shuō),符合以下3條規(guī)則:

原碼:將十進(jìn)制數(shù)字直接翻譯為二進(jìn)制數(shù)

反碼:原碼的符號(hào)位不變,其他位按位取反

補(bǔ)碼:反碼+1

而對(duì)于整型來(lái)說(shuō),整型在內(nèi)存中實(shí)際上是以補(bǔ)碼的形式進(jìn)行存儲(chǔ)的。

2.2 補(bǔ)碼的意義

有的同學(xué)可能就會(huì)問(wèn)了,為什么計(jì)算機(jī)要發(fā)展出原碼、反碼、補(bǔ)碼這么多種碼呢?

這就與計(jì)算機(jī)對(duì)于整數(shù)的運(yùn)算有關(guān)了。

CPU只有加法器,減法在運(yùn)算時(shí)也會(huì)被視作一個(gè)數(shù)加另一個(gè)負(fù)數(shù)??紤]到整數(shù)的最高位是符號(hào)位,兩個(gè)整數(shù)中若包含負(fù)數(shù),以原碼直接相加得到的數(shù)一定是不對(duì)的。所以問(wèn)題就變成了如何使得運(yùn)算簡(jiǎn)單而精確,既要處理符號(hào)位,又要只進(jìn)行加法運(yùn)算,達(dá)到以某一種二進(jìn)制形式的“碼”直接相加就能得到正確結(jié)果。

下面,我們以60+(-18)為例,分別用原碼、反碼、補(bǔ)碼直接進(jìn)行二進(jìn)制的運(yùn)算。

原碼運(yùn)算:


顯然,得到了的原碼轉(zhuǎn)化為10進(jìn)制是-78,并非正確答案42。

反碼運(yùn)算:


顯然,得到了的反碼轉(zhuǎn)化為10進(jìn)制原碼是41,并非正確答案42,但是只與正確答案相差(+1),于是,我們就想將負(fù)數(shù)的反碼+1,即變成“補(bǔ)碼”來(lái)進(jìn)行運(yùn)算,而又正數(shù)的補(bǔ)碼是原碼本身,這時(shí)候我們看看會(huì)怎么樣呢?

補(bǔ)碼運(yùn)算:


顯然,得到了的補(bǔ)碼轉(zhuǎn)化為10進(jìn)制原碼是42,我們得到了正確結(jié)果。

2.3 結(jié)論

綜上,我們發(fā)現(xiàn),只要將兩個(gè)整數(shù)使用補(bǔ)碼進(jìn)行運(yùn)算,就不需要考慮它們的符號(hào)位了,將它們的所有位直接簡(jiǎn)單相加即可,就能得到正確的結(jié)果。

2.4* 負(fù)數(shù)二進(jìn)制補(bǔ)碼的快速轉(zhuǎn)化

對(duì)于char類型整數(shù),-1用二進(jìn)制補(bǔ)碼表示為

當(dāng)我們已知一個(gè)負(fù)數(shù)的二進(jìn)制補(bǔ)碼時(shí),用比這個(gè)數(shù)多一位的、最高位為1、其他位全0、這里應(yīng)為9位的二進(jìn)制數(shù)

直接減去-1的二進(jìn)制補(bǔ)碼得

得到的數(shù)就是十進(jìn)制(-1)的絕對(duì)值,也就是1,只要加上負(fù)號(hào),就能快速得到這個(gè)負(fù)數(shù)二進(jìn)制補(bǔ)碼的十進(jìn)制原碼。

原理十分簡(jiǎn)單,一個(gè)負(fù)數(shù)的?原碼加上補(bǔ)碼?=?原碼+反碼+1?=?所有二進(jìn)制位全1再加1?=?多一位的、最高位為1、其他位全0

3. 大小端字節(jié)序

3.1 什么是大小端

在內(nèi)存中,數(shù)據(jù)的大小端存儲(chǔ)是在?字節(jié)?尺度上進(jìn)行討論的

大端存儲(chǔ)模式:數(shù)據(jù)的?低位?保存在內(nèi)存的?高地址?,數(shù)據(jù)的?高位?保存在內(nèi)存的?低地址

小端存儲(chǔ)模式:數(shù)據(jù)的?低位?保存在內(nèi)存的?低地址?,數(shù)據(jù)的?高位?保存在內(nèi)存的?高地址

3.2 為什么有大端和小端之分

在計(jì)算機(jī)系統(tǒng)中,我們通常是以字節(jié)為單位存儲(chǔ)數(shù)據(jù)的,每個(gè)地址對(duì)應(yīng)一個(gè)字節(jié)。

一個(gè)字節(jié)為8bit,但是在C語(yǔ)言中除了8bit的char之外,還有16bit的short,32bit的int。另外,對(duì)于位數(shù)大于8位的處理器,例如16位和32位的處理器,由于寄存器寬度大于一個(gè)字節(jié),那么必然存在著如何將多個(gè)字節(jié)安排的問(wèn)題。這邊導(dǎo)致了大小端存儲(chǔ)模式的誕生。

我們以int類型的數(shù)?0x01ff4218?為例(兩個(gè)十六進(jìn)制位即為1個(gè)字節(jié)),看一下在大小端下這4個(gè)字節(jié)分別是如何分配的

大端存儲(chǔ)模式?


小端存儲(chǔ)模式?


3.3 寫(xiě)一段代碼來(lái)判斷你的機(jī)器的大小端字節(jié)序

算法簡(jiǎn)單概括:截取4個(gè)字節(jié)大小的int整型的1個(gè)字節(jié)的低位。若機(jī)器為大端字節(jié)序,該字節(jié)存儲(chǔ)0x00;若機(jī)器為小端字節(jié)序,該字節(jié)存儲(chǔ)0x01;

參考文獻(xiàn)《C Primer Plus》 第六版, p494

另外,對(duì)現(xiàn)在我們的大多數(shù)朋友來(lái)說(shuō)還是學(xué)編程技術(shù)最重要!栽一棵樹(shù)最好的時(shí)間是十年前,其次是現(xiàn)在。對(duì)于準(zhǔn)備學(xué)習(xí)編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開(kāi)始!

微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地

整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!



C/C++編程知識(shí):整型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)!講解+示例的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
高雄市| 黔南| 中西区| 井研县| 柳州市| 济阳县| 灵宝市| 双江| 鄂温| 屏东县| 微博| 同心县| 富锦市| 潍坊市| 华安县| 深泽县| 光泽县| 海安县| 通山县| 通渭县| 故城县| 额济纳旗| 阿拉善盟| 雅安市| 舟曲县| 土默特右旗| 大邑县| 五峰| 石泉县| 梅河口市| 拜城县| 紫阳县| 合作市| 易门县| 佛冈县| 张家港市| 乌恰县| 泾阳县| 富川| 重庆市| 仁化县|