2、原碼補碼反碼
二、浮點型在記憶體中的儲存
(32位系統)
在vs2013中,使用除錯->視窗->記憶體,來觀察記憶體的具體情況。
讓我們通過記憶體視窗來看看整型在記憶體中的儲存,
定義乙個整形變數int a= 10;
。
注意:可以在位址列中使用&來找到目標變數的記憶體情況。
int型在記憶體中是以4個位元組為單位儲存的,記憶體中用16進製表示。可以看到a的值為0a(16進製制),換算成十進位制就是10。
為什麼會有大小端模式之分呢?
這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。我們輸入乙個十六進製制數,來觀察一下在記憶體中的情況
;以上例子在大端位元組序中的儲存是這樣的:
規定:返回0不是,返回1是。
#include
intisbigend
(int a)
return0;
}int
main()
計算機中的符號數有三種表示方法即原碼、補碼、反碼。正數的原、反、補碼都相同。
三種表示方法均有符號位和數值位兩部分,符號位都是用0表示「正」,用1表示「負」,而數值位三種表示方法各不相同。
原碼:直接將二進位制按照正負數的形式翻譯成二進位制就可以。
反碼:將原碼的符號位不變,其他位依次按位取反就可以得到了。
補碼:反碼+1就得到補碼。對於整形來說:資料存放記憶體中其實存放的是補碼。
-10在記憶體中的儲存:
在上面已經為大家介紹了小端位元組序,因為我的計算機是小端位元組序。
所以它的值就為ff ff ff f6。
用二進位制的方式表示:可以看到和上面ff ff ff f6轉換成二進位制的結果相同。1111 1111 1111 1111 1111 1111 1111 0110
-10的原碼:
1000 0000 0000 0000 0000 0000 0000 1010
-10的反碼:
1111 1111 1111 1111 1111 1111 1111 0101
-10的補碼(反碼+1):
1111 1111 1111 1111 1111 1111 1111 0110
為什麼對於整形來說,資料存放記憶體中其實存放的是補碼呢?
資料存放記憶體中其實存放的是補碼在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理(cpu只有加法器)此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。補碼存在的意義就是讓硬體實現簡單。
比如:把負數按補碼表示,可以統一±為+。
例子:1-10=1+(-10)
根據國際標準ieee(電氣和電子工程協會),任意乙個二進位制浮點數v可以表示成下面的形式:ieee 754規定:(-1)^s * m * 2^e
(-1)^s表示符號位,當s=0,v為正數;當s=1,v為負數。
m表示有效數字,大於等於1,小於2。
2^e表示指數字。
舉例來說:
十進位制的5.0,寫成二進位制是101.0,相當於1.01×2^2。 那麼,按照上面v的格式,可以得出s=0,m=1.01,e=2。
十進位制的-5.0,寫成二進位制是-101.0,相當於-1.01×2^2。 那麼,s=1,m=1.01,e=2。
對於32位的浮點數,最高的1位是符號位s,接著的8位是指數e,剩下的23位為有效數字m。
對於64位的浮點數,最高的1位是符號位s,接著的11位是指數e,剩下的52位為有效數字m。
m占用的位元位越多,資料精度越高。
e占用的位元位越多,資料範圍越大。
所以在實際開發中使用double較多。
使用這種方式來儲存的時候,會帶來乙個很大的問題,儲存的小數往往不是乙個精確值,而只是乙個近似值。
示例:
#include
intmain()
else
system
("pause");
return0;
}
實際上11.0/3.0*3.0肯定等於11.0。
但是我們看看執行結果:
浮點數在記憶體中儲存的時候,很多時候是有誤差的。
正確的比較方法:
使用做差的方法,然後判斷差值是不是在允許誤差範圍內,如果在的話,就相等。
#include
#define n 1e-4
intmain()
else
system
("pause");
return0;
}
資料在記憶體中的儲存
身為乙個天天處理資料的人,不得不說資料在記憶體中的儲存是必須要知道的問題。首先,資料在記憶體中的儲存涉及到作用域,儲存位置等方面的問題。根據資料的作用域,可將資料劃分為區域性變數和全域性變數 區域性變數的作用域為從定義開始到函式執行結束 全域性變數的作用域從程式開始到程式結束。計算機的記憶體分配可以...
資料在記憶體中的儲存
大端,把乙個數字高位位元組序的內容儲存到低位址,低位位元組序內容儲存到高位址處 小端,把乙個數字高位位元組序的內容儲存到高位址,低位位元組序內容儲存到低位址處 判斷乙個機器是大端還是小端?指標判斷 int checksys 聯合體 共用體 union un int main 這裡首先需要知道的是,例...
資料在記憶體中的儲存
我們都知道在計算機中資料型別都有 char 1 short 2 int 4 long 4 8 float 4 double 8 等內建型別,以及他們所佔的空間大小。型別的意義 1.使用這個型別開闢記憶體空間的大小 大小決定使用範圍 2.如何看待記憶體空間的視角。型別歸類 整形家族 char unsi...