在計(jì)算機(jī)中最小的信息單位是bit酥泛,也就是一個(gè)二進(jìn)制位今豆,8個(gè)bit組成一個(gè)Byte,也就是字節(jié)柔袁。一個(gè)存儲(chǔ)單元(一個(gè)地址)晚凿,可以存儲(chǔ)一個(gè)字節(jié),也就是8個(gè)二進(jìn)制位瘦馍。計(jì)算機(jī)的存儲(chǔ)器容量是以字節(jié)為最小單位來(lái)計(jì)算的歼秽,對(duì)于一個(gè)有128個(gè)存儲(chǔ)單元的存儲(chǔ)器,可以說(shuō)它的容量為128字節(jié)情组。
地址總線燥筷,是用來(lái)傳輸數(shù)據(jù)所在地址的,而32位系統(tǒng)一般有32根地址總線院崇,那么所能傳輸?shù)淖畲髷?shù)據(jù)地址就是2^32肆氓,這里所指的地址是真實(shí)的數(shù)據(jù)地址,即物理地址底瓣。用戶在使用計(jì)算機(jī)時(shí)能夠訪問(wèn)的最大內(nèi)存不單是由CPU地址總線的位數(shù)決定的谢揪,還需要考慮操作系統(tǒng)的實(shí)現(xiàn)。實(shí)際上用戶在使用計(jì)算機(jī)時(shí)捐凭,進(jìn)程訪問(wèn)到的地址都是邏輯地址拨扶,并不是真實(shí)的物理地址,邏輯地址是由操作系統(tǒng)提供的茁肠,并維護(hù)了邏輯地址和物理地址的映射患民。對(duì)于32位的windows操作系統(tǒng),提供的邏輯地址尋址范圍是4G垦梆,但是對(duì)于這4G的邏輯地址匹颤,又要?jiǎng)澐殖鰜?lái)一份給CPU寄存器仅孩、ROM的這些物理地址進(jìn)行映射,那么剩下和內(nèi)存條的物理地址進(jìn)行映射的空間肯定沒(méi)有4G了,而[64位操作系統(tǒng)的尋址能力就是2的64次方印蓖,也就是17179869184G招狸,當(dāng)然這只是理論值数尿,實(shí)際中不可能用到這么大的內(nèi)存碉纳,目前64位windows系統(tǒng)最大只支持128G团搞。而當(dāng)前主流主板只能加到16G
int和uint 是多少位,取決于運(yùn)行環(huán)境版本位數(shù)
64位golang運(yùn)行環(huán)境摆尝,1個(gè)int是64位,占8字節(jié)因悲。 8G內(nèi)存能存儲(chǔ) 大約13億個(gè)int整數(shù)
unsafe包Sizeof返回類(lèi)型v本身數(shù)據(jù)所占用的字節(jié)數(shù)堕汞。返回值是“頂層”的數(shù)據(jù)占有的字節(jié)數(shù)。例如晃琳,若v是一個(gè)切片讯检,它會(huì)返回該切片描述符的大小,而非該切片底層引用的內(nèi)存的大小卫旱。
1個(gè)字節(jié)型byte占 1字節(jié)
1個(gè)字符類(lèi)型rune 4個(gè)字節(jié) (等價(jià)于int32 )
1個(gè)漢字 3個(gè)字節(jié)
(var str byte = '中') overflows byte 漢字占3個(gè)字節(jié)
(str := '中' 自動(dòng)推到類(lèi)型為int32 4字節(jié))
golang中string底層是通過(guò)byte數(shù)組實(shí)現(xiàn)的人灼。中文字符在unicode下占2個(gè)字節(jié),在utf-8編碼下占3個(gè)字節(jié)顾翼,而golang默認(rèn)編碼正好是utf-8投放。所以golang中1個(gè)漢字3字節(jié) 。
golang中還有一個(gè)byte數(shù)據(jù)類(lèi)型與rune相似适贸,它們都是用來(lái)表示字符類(lèi)型的變量類(lèi)型灸芳。它們的不同在于:
byte 等同于int8,常用來(lái)處理ascii字符
rune 等同于int32,常用來(lái)處理unicode或utf-8字符
"hello 你好"
fmt.Println("len(str):", len(str))
運(yùn)行結(jié)果:12 (1個(gè)漢字3個(gè)byte字節(jié))
//golang中的unicode/utf8包提供了用utf-8獲取長(zhǎng)度的方法
//函數(shù)類(lèi)似RuneCount但輸入?yún)?shù)是一個(gè)字符串拜姿。
fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))
運(yùn)行結(jié)果:8 (一個(gè)rune等于int32 4字節(jié)烙样,能存儲(chǔ)1個(gè)漢字)
//通過(guò)rune類(lèi)型處理unicode字符
fmt.Println("rune:", len([]rune(str)))
運(yùn)行結(jié)果:8 (一個(gè)rune等于int32 4字節(jié),能存儲(chǔ)1個(gè)漢字)