小結
在計算機中最小的資訊單位是bit,也就是一個二進位制位,8個bit組成一個Byte,也就是位元組。一個儲存單元(一個地址),可以儲存一個位元組,也就是8個二進位制位。計算機的儲存器容量是以位元組為最小單位來計算的,對於一個有128個儲存單元的儲存器,可以說它的容量為128位元組。
地址匯流排,是用來傳輸資料所在地址的,而32位系統一般有32根地址匯流排,那麼所能傳輸的最大資料地址就是2^32,這裡所指的地址是真實的資料地址,即實體地址。使用者在使用計算機時能夠訪問的最大記憶體不單是由CPU地址匯流排的位數決定的,還需要考慮作業系統的實現。實際上使用者在使用計算機時,程序訪問到的地址都是邏輯地址,並不是真實的實體地址,邏輯地址是由作業系統提供的,並維護了邏輯地址和實體地址的對映。對於32位的windows作業系統,提供的邏輯地址定址範圍是4G,但是對於這4G的邏輯地址,又要劃分出來一份給CPU暫存器、ROM的這些實體地址進行對映,那麼剩下和記憶體條的實體地址進行對映的空間肯定沒有4G了,而[64位作業系統的定址能力就是2的64次方,也就是17179869184G,當然這只是理論值,實際中不可能用到這麼大的記憶體,目前64位windows系統最大隻支援128G。而當前主流主機板只能加到16G
int和uint 是多少位,取決於執行環境版本位數
64位golang執行環境,1個int是64位,佔8位元組。8G記憶體能儲存大約13億個int整數
unsafe包Sizeof返回型別v本身資料所佔用的位元組數。返回值是“頂層”的資料佔有的位元組數。例如,若v是一個切片,它會返回該切片描述符的大小,而非該切片底層引用的記憶體的大小。
1個位元組型byte佔1位元組
1個字元型別rune4個位元組 (等價於int32 )
1個漢字3個位元組
(var str byte = '中')overflows byte漢字佔3個位元組
(str := '中'自動推到型別為int324位元組)
golang中string底層是通過byte陣列實現的。中文字元在unicode下佔2個位元組,在utf-8編碼下佔3個位元組,而golang預設編碼正好是utf-8。所以golang中1個漢字3位元組 。
golang中還有一個byte資料型別與rune相似,它們都是用來表示字元型別的變數型別。它們的不同在於:
byte 等同於int8,常用來處理ascii字元
rune 等同於int32,常用來處理unicode或utf-8字元
"hello 你好"
fmt.Println("len(str):", len(str))
執行結果:12 (1個漢字3個byte位元組)
//golang中的unicode/utf8包提供了用utf-8獲取長度的方法
//函式類似RuneCount但輸入引數是一個字串。
fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))
執行結果:8(一個rune等於int32 4位元組,能儲存1個漢字)
//通過rune型別處理unicode字元
fmt.Println("rune:", len([]rune(str)))
執行結果:8(一個rune等於int32 4位元組,能儲存1個漢字)