資料在記憶體中儲存分為兩種模式,大端模式下,高位元組低位址,小端模式下低位元組高位址。
因為符號數在計算機儲存的是補碼,整數-2
,的補碼通過簡單計算可以求得
-2
的絕對值為2
,2
的原碼為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個位元組
儲存,char
和signed char
為有符號整數,所以會把-2
的符號位擴充,變成0xff ff ff fe
將原碼列印出來,結果為-2
,unsigned char
為無符號整型,所以會填0
擴充為0x 00 00 00 fe
,列印出來結果為254
。
同樣的,-128
在記憶體中表示為0x80
。呼叫printf
時,甭管傳入的是什麼型別,printf
只會根據型別的不同將用兩種不同的長度儲存。其中8
位元組的只有long long
、float
和double
(注意float
會處理成double
再傳入),其他型別都是4位元組
。所以0x80
按4位元組
儲存為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,指數字...