最近在學習關於逆向的一些玩意,發現逆向不得不說都是些玩底層的玩意。
在學習的過程中,發現了乙個其實在正向開發中也用的很多的底層知識點,就是位和位元組。
比如乙個數字a究竟是怎麼存在記憶體中的。
本次就以go語言舉例,go語言是類c語言,一些底層還是很相近的!
**
package main
import
("fmt"
"unsafe"
)func
main()
執行結果
有幾個問題
我a變數命名時字元a,為什麼十進位制是97,二進位制是1100001
?
為什麼變數c命名是98,卻能輸出b?
要像理解上述問題,還是要理解本質問題。
我們的程式,終究是跑在記憶體中的。
而我們的記憶體條,大概是這樣。
記憶體條的本質,本質就是乙個個的電子元件,終究只有兩種狀態,通電(1),沒通電(0)。
乙個電子元件,就是乙個位。
而乙個位元組,等於8位,1位元組=8位
。
一位,就是乙個0或1,就是二進位制,非0即1。
乙個位元組,就是8個0或1,就像這樣,00000000
,如果看到不足8個0或1,將前面都補成0,補夠8位。
通常情況下,語言一般只操作到位元組,很少操作到位。
雖然上述我們知道了,乙個位表示的就是乙個通電或者沒通電的電子元件。
乙個位元組表示的是8個通電或者沒通電的電子元件的組合。
但是這樣並沒有解決實際問題啊,我想存乙個10,在加上乙個20,進行加法計算,咋辦???
所以這時候,就要有乙個什麼規定,哪個亮,或者哪個不亮,就表示是什麼。
所以就有了ascii
這個規範,這個規範的最小單位是位元組,也就是同時管理8個0或1。
比如說,第乙個位元組,就是前八位,如果說全部都是0,就表示的是十進位制數字0。
8個二進位制表示方式是00000000
。
又規定,從末尾開始計算,如果末尾亮了,其他7個沒亮,表示十進位制1。
等等等等,通過位元組組織位,通過每8位不同的組合,表示不同的符號或者數字或者字母等。
具體二進位制對應的符號或者數字:
通過查詢ascii
可知。
字母a的二進位制是0110 0001
,十進位制是97
,表示的符號是a
。
所以就和開頭對上咯!
為什麼98能輸出b,還是因為ascii
,因為98代表的就是字母b,就是二進位制0110 0010
。
只不過是輸出方式不一樣。
其實乙個位元組,8位,如果全部亮燈,就是11111111
,他的十進位制是255
,理論來說是可以支援255個符號的。
對於英語的國家應該是湊合了,乙個字母8位,乙個位元組,存乙個hello就是5個位元組,一共需要40位就足夠了。
但是現如今,計算機早已經成為一顆參天大樹,中國再用,小日本再用,棒子再用,各國的文字加起來早都不是255個那麼簡單了。
所以衍生出像中國的gbk
等一些編碼,各種編碼都是基於ascii
擴充的。
ascii
佔乙個位元組,8位,那我gbk
不夠啊,幾萬個漢字呢,那我佔倆位元組,16位,16個0或者1,應該湊合吧,再不行三個位元組,24個0或1,三個位元組十進位制就已經到16777215
了,上千萬了,足夠儲存各國的符號和文字了。
但是gbk
和其他編碼又不通用,所以現在又衍生出utf-8
等編碼收錄各國的編碼。
目前utf-8
是乙個最好的編碼,基本已經支援所以計算機。
本篇主要是理解計算機記憶體的本質,1位元組=8位
,1位=乙個通電or沒通電的電子元件
,通過不同的00101010
表示不同的符號。
經過這麼多年的發展,utf-8
已經很成熟,目前趨勢很穩定。
越努力,越幸運。
我是碼農星期八,如果覺得還不錯,記得動手點讚一下哈。
感謝你的**。
關於整型資料符號位擴充套件的問題
關於符號擴充套件的問題,我們大家讀到最多的一句關於符號擴充套件規律就是 對於無符號整型資料,要擴充套件成符號位的話,就是將擴充套件位補零,其他位保持不變。但對於有符號整型資料的符號擴充套件規律就是 原來符號位為1時,符號擴充套件位補1 原來符號位為0時,符號擴充套件位補0 其他位保持不變。剛開始自己...
關於整型資料符號位擴充套件的問題
1 符號擴充套件 當用更多的記憶體儲存某乙個有符號數時,由於符號位位於該數的第一位,擴充套件之後,符號位仍然需要位於第一位,所以,當擴充套件乙個負數的時候需要將擴充套件的高位全賦為1 對於正數而言,符號擴充套件和零擴充套件是一樣的,因為符號位就是0。比如乙個用乙個8 位二進位制表示 1,則是 100...
關於整型資料符號位擴充套件的問題
關於符號擴充套件的問題,我們大家讀到最多的一句關於符號擴充套件規律就是 對於無符號整型資料,要擴充套件成符號位的話,就是將擴充套件位補零,其他位保持不變。但對於有符號整型資料的符號擴充套件規律就是 符號擴充套件為補1,其他位保持不變。剛開始自己也不太明白為什麼會這樣擴充套件,只是記住了這個規律,後來...