計算機都是二進位制來儲存資料的。
計算機用原碼,反碼,補碼來表示有符號數。資料有符號位和資料為,符號位有『0』和『1』,1表示負數,0表示正數。
原碼:直接將二進位制按照正負數的形式翻譯成二進位制就可以。
反碼:將原碼的符號位不變,其他位依次按位取反就可以得到了。
補碼:反碼+1就得到補碼。
在這個簡單的程式中我們可以看見a的記憶體位址為04 00 00 00,跟我們寫出來00 00 00 04不一樣,這是因為大小端問題。
什麼是大小端:
大端(儲存)模式:是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中;
小端(儲存)模式:是指資料的低位儲存在記憶體的低位址中,而資料的高位,,儲存在記憶體的高位址中。
為什麼有大小端:
為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。
例如乙個 16bit 的 short 型 x ,在記憶體中的位址為 0x0010 , x 的值為 0x1122 ,那麼 0x11 為高位元組, 0x22
為低位元組。對於大端模式,就將 0x11 放在低位址中,即 0x0010 中, 0x22 放在高位址中,即 0x0011 中。小端模式,剛好相反。我們常用的 x86 結構是小端模式,而 keil c51 則為大端模式。很多的arm,dsp都為小端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。
判斷自己的電腦是大端還是小端儲存:
**1
int
check_sys()
intmain()
else
return0;
}
**二:
int
check_sys()
un; un.i =1;
return un.c;
}int
main()
else
return0;
}
首先我們可以通過兩個**來看這個問題:
**1
#include
intmain()
結果:
這個執行結果為4294967168不是-128.
我們知道char型別的常量佔乙個位元組(8個bite位)
常數128是乙個整型,佔四個位元組(32個bite位)
i只能儲存乙個位元組(八個bite位)的二進位制位。
-128的二進位制位位:
這是i的位址位為10000000
u%列印需要整型提公升。
00000000 00000000 00000000 10000000
01111111 11111111 11111111 10000000
所以結果為4294967168
**2
#include
intmain()
執行結果:
128的二進位制位址位
有符號數以補碼儲存,所以char型別i的二進位制位址為10000000,
而列印以%u列印這就要整型提公升
因此:這是i的位址位011111111 11111111 11111111 10000000這是無符號列印所以為4294967168,如果是%d列印結果就是-128
浮點型在記憶體中的儲存
浮點數家族包括: float、double、long double 型別。
int
main()
結果:
num 和 *pfloat 在記憶體中明明是同乙個數,為什麼浮點數和整數的解讀結果會差別這麼大? 要理解這個結果,一定要搞懂浮點數在計算機內部的表示方法。
詳細解讀:
根據國際標準ieee(電氣和電子工程協會) 754,任意乙個二進位制浮點數v可以表示成下面的形式:
(-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。
ieee 754規定: 對於32位的浮點數,最高的1位是符號位s,接著的8位是指數e,剩下的23位為有效數字m。
對於64位的浮點數,最高的1位是符號位s,接著的11位是指數e,剩下的52位為有效數字m。
PostgreSQL的資料儲存 八 資料儲存
在作業系統層面,資料儲存,只是一些二進位制資訊,這個層次,是不知道檔案內容的含義的。檔案的邏輯含義,取決於應用層面。資料庫系統的檔案組織,也如此。在外存儲存,以二進位制格式存放,讀寫檔案,以塊 8k 為單位,讀入的資料,存放與資料緩衝區,所以,資料的邏輯含義,始於資料緩衝區。在bufpage.h檔案...
資料的儲存
1.整形在記憶體中的儲存 1 在計算機系統中,整數統一用補碼來表示和儲存。原碼 直接將二進位制按照正負數的形式翻譯成二進位制。反碼 將原碼的符號位不變,其他位按位取反。補碼 反碼加1就得到補碼。正數的原碼,反碼,補碼都相同 2 在記憶體中儲存時,還有大小端儲存方式 大端 儲存 模式,是指資料的低位儲...
資料的儲存
列表是一種儲存大量資料的儲存模型。列表具有索引的概念,可以通過索引操作列表中的資料。列表中的資料可以進行新增 刪除 修改 查詢等操作。建立列表 變數名 資料1,資料2,獲取列表資料 變數名 索引 修改列表資料 變數名 索引 值 元組是一種儲存固定資料的儲存模型。元組具有索引的概念,可以通過索引操作元...