閑聊c/c++: 談內(nèi)存(大/小端,高/低字節(jié),高/低地址)

c/c++和其他語言最大區(qū)別在于: 指針

指針就是內(nèi)存地址,一旦明白了指針與內(nèi)存地址相關(guān)的內(nèi)容,那理解其他語言,就易如反掌。

而且你可以把其他語言用的更加好,更加有效率

例如java/js/objc中為什么容器中只能存儲(chǔ)引用類型?
如果存儲(chǔ)基本數(shù)據(jù)類型(值類型),為什么會(huì)發(fā)生效率很低的裝箱拆箱行為?
而c#為什么就不會(huì)呢?
你怎么才能讓不使用的內(nèi)存盡快被垃圾收集器回收過去?
還有很多涉及內(nèi)存相關(guān)的內(nèi)容,例如堆分配,棧分配等........

根據(jù)經(jīng)驗(yàn):

  1. 如果你一開始學(xué)的是c/c++,并且有這一定的c語言運(yùn)行庫(crt)及stl庫的使用經(jīng)驗(yàn),那么轉(zhuǎn)其他語言基本上只要熟悉一下語法就能快速上手

  2. 如果你有幾年開發(fā)經(jīng)驗(yàn),想更上一層樓,那么學(xué)習(xí)c/c++是必要的選擇。由于有程序的經(jīng)驗(yàn),學(xué)習(xí)c/c++并不算很難

本篇目的:

  • 什么是大端【Big-endian】小端【Little-endian】
  • 搞明白大端小端(關(guān)鍵是理解高/低字節(jié)以及高/低地址)

大小端的定義(來自百度百科的定義):

  • 大端:【高低低高|左左右右】
    數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址

  • 小端:【高高低低|左右右左】
    數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址

是不是感覺很繞口啊,特難理解吧!

理解大小端的關(guān)鍵點(diǎn)是明白:

  • 什么是高低地址
  • 什么是高低字節(jié)

高地址,低地址:

  • 計(jì)算機(jī)中最基礎(chǔ)的存儲(chǔ)單位是字節(jié)(byte)
    1 byte = 8 bit,00000000->11111111,表示范圍[0,255]
  • 對(duì)內(nèi)存中的每一個(gè)字節(jié)(byte),都有一個(gè)索引編號(hào),這就是傳說中的指針,也就是地址
高低地址.png

很容易理解高低地址了吧,就是書寫順序

高字節(jié),低字節(jié):

  • 對(duì)于一個(gè)字節(jié)(char/unsigned char/bool)的數(shù)據(jù)類型來說,是沒有高低字節(jié)之分的
  • 只有大于一個(gè)字節(jié)以上的數(shù)據(jù)類型(我們下面以unsigned int來舉例說明)才要區(qū)分高低字節(jié)
高低字節(jié).jpg

大端,小端

//第一個(gè)RGBA為unsigned int類型
typedef unsigned int RGBA;

//220 = DC
//110 = 6E
// 53 = 35
// FF = 255

RGBA rgba = 0xDC6E35FF


高低字節(jié)是:左高右低
高低地址是:左低右高


根據(jù)大端的定義:

數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址

則內(nèi)存存儲(chǔ)的方式是:

DC是最高字節(jié)[最左],放在內(nèi)存的最低地址[最左]
FF是最低字節(jié)[最右],放在內(nèi)存的最高地址[最右]
按照這個(gè)規(guī)則,很容易知道,大端在內(nèi)存存儲(chǔ)的順序是:


DC|6E|35|FF(和rgba = 0xDC6E35FF一致的順序)


根據(jù)小端的定義:

數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址

則內(nèi)存存儲(chǔ)的方式是:

DC是最高字節(jié)[最左],放在內(nèi)存的最高地址[最右]
FF是最低字節(jié)[最右],放在內(nèi)存的最低地址[最左]
按照這個(gè)規(guī)則,很容易知道,小端在內(nèi)存存儲(chǔ)的順序是:


FF|35|6E|DC(和rgba = 0xDC6E35FF相反的順序)


這樣就很清楚的了解了大端和小端的含義了??!

口訣:

先字節(jié)后地址:

  • 大端: 高低低高|左左右右|方向一致
  • 小端: 高高低低|左右右左|方向相反

附:今天老師帶隊(duì)一起寫生去 文章我昨天半夜寫的


圖片發(fā)自簡(jiǎn)書App
最后編輯于
?著作權(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)容