在我們編寫程式的時候輸入一下簡單程式
執行後,會輸出a的值,也就是1。但是在記憶體上,a的值又是怎樣表示的呢?一下將分為三種情況進行分析說明。
1、正整數
程式如下:
通過gdb指令檢視除錯資訊之後的得到下面的資訊:
可見a的位址是0xbffff1b8,內容是0x01 0x00 0x00 0x00,根據高高低低的原則可看出a中資料就是1,同理可見b中的資料為0x12345678
也就是說,輸入整數之後資料按照高高低低的排列規則進行排列放入相關引數的記憶體中。
2、負整數
前面說到了輸入1的時候記憶體中會存入1,那麼輸入-1的時候會是什麼情況呢 ?
通過gdb指令檢視除錯資訊之後的得到下面的資訊:
可以看出-1輸入之後在記憶體中表現為0xff,而-2表現為0xfe
下面我們來計算-1 和-2的反碼和補碼:
-1:原碼 1000 0001
反碼 1111 1110
補碼 11111111 0xff -2
原碼 1000 0010
反碼 11111101
補碼111111100xfe
很明顯可以看出-1,-2 的補碼與記憶體中-1,-2的表現形式是一樣的。
也就是說,當輸入為負整數的時候,在記憶體中將會以負數補碼形式存在。
3、正負小數
這裡我們以輸入2.5和-2.5為例
通過gdb指令檢視除錯資訊之後的得到下面的資訊:
並且單精度和雙精度所佔的空間是不一樣的:這裡是單精度,符號位佔1位,指數字佔8位,轉換後小數點後的數字佔23 位
但是雙精度則是:符號位佔1位,指數字佔11位,轉換後小數點後的數字佔52位
接下來開始轉化小數
2.5表示為二進位制位10.1(0.5的轉換是根據乘2取整得到的)
算上符號位即是010.1
再將其轉化為01.01*10^1
指數字為127+指數的二進位制即是1000
根據前面說到的表現形式可得: 0 1000 0000 0100 0000 0000 0000 0000 000
符號位 指數字小數
寫成標準二進位制就是 0100 0000 0010 0000 0000 0000 0000 0000
轉換成十六進製制便是 0x40 0x20 0x00 0x00
這與截圖是一致的
而-2.5僅需將符號位改為1即可,在這裡將不再累述。
c語言總結 1 資料在記憶體中的儲存
int check sys un un.i 1 return un.c int main 之所以用聯合體是因為聯合體的成員共用同一塊記憶體空間 char a 1 signed char b 1 unsigned char c 1 printf d d d a,b,c 結果為 1 1 255,因為un...
C語言 資料在記憶體中的儲存
字元型資料 1.字元與字元 把字元的相對應的ascii碼 整數,對映關係見ascii碼表 放到儲存碼單元中,而這些ascii 值在計算機中同樣以二進位制補碼的形式存放的。2.字元變數 字元型資料的儲存空間和值的範圍 32位操作平台 型別位元組數 取值範圍 signed char 有符號字元數 1 2...
資料在記憶體中的儲存c語言
基本內建型別 char 字元資料型別 short 短整型 int 整形 long 長整型 long long 更長的整形 float 單精度浮點數 double 雙精度浮點數使用這個型別開闢的記憶體空間大小 大小決定了適用範圍 如何看待記憶體空間的視角。在32位平台下,任何指標型別都只佔4個位元組。...