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):
如果你一開始學(xué)的是c/c++,并且有這一定的c語言運(yùn)行庫(crt)及stl庫的使用經(jīng)驗(yàn),那么轉(zhuǎn)其他語言基本上只要熟悉一下語法就能快速上手
如果你有幾年開發(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),這就是傳說中的指針,也就是地址

很容易理解高低地址了吧,就是書寫順序
高字節(jié),低字節(jié):
- 對(duì)于一個(gè)字節(jié)(char/unsigned char/bool)的數(shù)據(jù)類型來說,是沒有高低字節(jié)之分的
- 只有大于一個(gè)字節(jié)以上的數(shù)據(jù)類型(我們下面以unsigned int來舉例說明)才要區(qū)分高低字節(jié)

大端,小端
//第一個(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ì)一起寫生去 文章我昨天半夜寫的
