x86下整數與浮點數的儲存

2021-10-18 19:23:28 字數 2435 閱讀 7844

資料在記憶體中儲存分為兩種模式,大端模式下,高位元組低位址,小端模式下低位元組高位址。

因為符號數在計算機儲存的是補碼,整數-2,的補碼通過簡單計算可以求得

-2的絕對值為22的原碼為0x00 00 00 02,最高位為符號位,正數為0,負數為1,將最高位改為1-2的原碼0x80 00 00 02再計算-2的反碼,對原碼符號位不動,其它位取反,得0xff ff ff fd將反碼加1,得到補碼0xff ff ff fe

在vs中除錯調出記憶體視窗,可以看到變數i在記憶體中是按低位址儲存低位元組,即最低位fe儲存在低位址0x004ffcf4

從圖中可以看到將-2賦值給float型別變數後,在記憶體中儲存的數與int變數是不相同的,儲存的值位0x 00 00 00 c0。由此可以看出字面量(-2的補碼)雖然相同,但是當字面量賦值給不同型別的變數時,記憶體中儲存的數值可能會發生改變。

float型別的資料儲存格式如上圖所示,其中按照ieee754標準,1<=m<2,所以-2按照(-1)^s*m*2^e格式儲存可以看成s=1 m=1.0 e=1。又根據標準,在儲存m時,只儲存小數點後的數值,e是乙個8位無符號整數,為了解決負指數儲存問題,標準規定在儲存時需要將e的真實值加上乙個中間值(指數字為8位時,加127)。

所以,-2的儲存為1 10000000 00000000000000000000000000000000,又因為是小端模式,所以在除錯視窗中看到的是反過來的0xc0 00 00 00

#include

intmain()

-2在記憶體中表示為0xff ff ff fe,字元型別的變數均為8bit,所以變數中的值為0xfe,因為呼叫printf時傳入的佔位符是%d,所以會把0xfe按照4個位元組儲存,charsigned char為有符號整數,所以會把-2的符號位擴充,變成0xff ff ff fe將原碼列印出來,結果為-2unsigned char為無符號整型,所以會填0擴充為0x 00 00 00 fe,列印出來結果為254

同樣的,-128在記憶體中表示為0x80。呼叫printf時,甭管傳入的是什麼型別,printf只會根據型別的不同將用兩種不同的長度儲存。其中8位元組的只有long longfloatdouble(注意float會處理成double再傳入),其他型別都是4位元組。所以0x804位元組儲存為0xff ff ff 80,將其以無符號整型列印,結果為4294967168

x86浮點數指令

x86架構下,一般通過專用協處理器計算浮點數。浮點數運算通過fpu float point unit,浮點運算單元計算 計算,提供了浮點棧暫存器st0 st7。fld mem 浮點數入棧 fmul mem st 0 st 0 mem fst mem st 0 轉換為指定精度的浮點數 fstp mem...

整數與浮點數

整數和浮點數可以一起運算 四則運算 加法 num1 10 num2 0.5 reault num1 num2 print result 10.5 減法result num1 num2 print result 9.5 乘法result num1 mun2 print result 5 除法resul...

浮點數的儲存

浮點數在計算機中的儲存格式 符號位 指數字 尾數字 符號位 指數字 尾數字 float 1位 8位 23位 共32位 double 1位 11位 52位 共64位 任何浮點數都可表示為 1.m 2e 符號位 sign 表示式中的 0表示正數,1表示負數。指數字 exponent 表示式中的e,指數字...