c/c++語言中,資料型別有很多,常用的:int、long、short、char以及他們的unsigned型。我們熟知,int、long都是占用32位(4位元組)。short佔16位(2位元組)。int和long的範圍為0x00000000~0x7fffffff、0x80000000~0xffffffff。對應的unsigned型範圍為:0x00000000~0xffffffff。而short也類似,都是基礎知識,這裡不做介紹。
在記憶體中,數字都是二進位制,為了方便,通常都是按十六進製制顯示的,例如int中的100,實際上是0x64,然而,資料本身是4位元組,其他的應該填充0,所以實際上是0x00000064。long也一樣,short也類似,下面,我們回來驗證。
分析程式如下:
在記憶體視窗中,我們輸入&n_i,檢視n_i的記憶體處,可以看見如下:
可以發現,裡面全是cccccccc,這是由於vs工具在沒有使用的位置全部初始化成cccccccc,方便我們除錯,然後,f10,執行一步程式,可以發現,上圖黃色區域的四個位元組變成了(64 00 00 00),並不是(00 00 00 64),同樣的,我們在將記憶體視窗定位到u_i變數的記憶體位置,執行程式到初始化u_i,可發現,還是一樣的效果,實際上,windows儲存資料本來就是按照這樣,低位對應記憶體低位,高位對應記憶體高位。實際上這被稱為小尾方式儲存。對應的也有大尾方式,只是儲存方式的不同,但我們任然可以理解,實際上,儲存的就是0x00000064。
補碼:計算機中,負數儲存的是補碼,不嘛的計算等是計算機基礎知識,這裡不做介紹,但是,這對反彙編很重要。
然而,這裡存在一點比較讓人疑惑,在彙編中,有符號和無符號的int都是占用32位,例如-2,即0xfffffffe,按照有符號解析,就是-2,按照無符號解析,就是4294967294,結果完全不一樣。我們在看反彙編的時候,同樣是32位,如果沒區分好有符號無符號,結果就可能大不一樣,因此,在分析反匯程式設計序的時候,需要通過其他的方式區分有無符號。
在彙編中,有時候,我們還需要儲存浮點數,c/c++中,用float和double儲存浮點數,區別在於占用位元組不一樣,double占用8位元組float占用四位元組,double精度更高。兩者都是使用的ieee編碼。
ieee編碼以科學計數法將浮點數的二進位制分為符號位,指數,尾數三部分,以float為例,首位為符號位,之後8位為指數為,後面23位均為尾數部分
例如使用float儲存12.25ff:12的二進位制為1100,0.25的二進位制為.01
(8 4 2 1 . 1/2 1/4 1/8),因此,12.25儲存為二進位制為1100.01,即1.10001,指數為3,是乙個正數,符號位為0,指數為3,需要加127,=130,放在指數字為10000010,在ieee編碼中,首位恆定為1(1.10001中第乙個1),因此可以不記錄,可以直接將10001儲存在尾數部分,尾數不足時,全部補0。
double的資料儲存也是大同小異,對於浮點數,特別注意的是其轉換過程,對於cpu中,也有專門的浮點數暫存器。
可以看出,第乙個就是指標的賦值,說到指標大家可能更難理解,實際上,這一步就是將0x011ecd1c這個數賦值到乙個指標中(char*),這個指標雖然是char*,但是char*是指標,也是佔4位元組,只有char是佔1位元組。
看起來,被翻譯成了很多行,然而,實際上做的事情很簡單,就是將「i love mark」按照4位元組的單位搬到arr_str中,我們可以發現,實際上,**是有規律的,分三次,每次將四位元組搬到資料暫存器eax,然後,將eax搬到對應的記憶體位址,這裡記憶體位址也是每次移動四個。搬到的地方為棧區,之前我們就已經知道了ebp為棧頂。
上面**,我們可以看出,指標和引用的彙編**完全一樣,都是使用lea指令取出位址,再將位址賦給變數。因為,引用屬於編譯時期檢查,對於最終的執行沒有任何影響,他只作用於編譯器,在編譯的時候的一些處理。在反彙編時,我們看不出是使用的引用還是指標,但是,他們最終效果都一樣,這並不影響我們的反彙編過程。
引用並不會影響程式的執行速度,而且還比指標多了編譯器的一些檢測,所以,在c++程式設計的時候,使用引用更好。
我們可以看到,巨集定義本身不會產生彙編**,而在使用的時候,直接就替換了,直接使用的64h,而const卻和普通的賦值是一樣的,在彙編下,加const和不加const,本質一樣,這也從本質上說明了,const只是作用於編譯器,是編譯期間使用的。
003 mysql 資料型別
2 string types 字串型別 以上均可以插入,插入後 a 變成了 a。以上均可以插入,插入後大寫都會變成小寫。位 bit,位元位,乙個二進位制數字0或1就是乙個位。位元組 byte 簡記b 1byte 8bit,1byte就是1b。ascii碼 ascii碼字元,共128個字元,任何乙個字...
反彙編學習之整數型別
c 提供的整數型別包括short int和long,每種型別都分為有符號和無符號兩種型別,在筆者另一篇文章中敘述過,在不同的編譯器下實現不同,三種型別在記憶體中所佔的大小也不統一。在vc和gcc下,short佔2位元組,int佔4位元組,long佔4位元組,long long佔8位元組。下面的講解中...
go入門003 go 內建資料型別
go 內建資料型別主要分為數值型 number 和字串型別 string 1.數值型 數值型有三種,一種是整數型別,另外一種是帶小數的型別 一般計算機裡面叫做浮點數型別 還有一種虛數型別。go的內建整型有byte,uint8,uint16,uint32,uint64,int8,int16,int32...