截圖很好
1,檔案是對i/o裝置的抽象,虛擬記憶體是對i/o和記憶體的抽象,程序是對i/o和記憶體和處理器的抽象,處理器是除了i/o和記憶體之外的其他東西(在只有乙個原始的計算機組成時),記憶體是指ram。虛擬機器是對i/o和記憶體和處理器和作業系統的抽象,網路可以看作是i/o裝置。
1,大端模式與小端模式本身沒有差別。inter cpu使用的是小端模式。
0x12345678
如下函式,c1=22,c2=11,就是小端模式,否則就是大端模式
int _tmain(int argc, _tchar* argv)
下面的函式也可以
int check_end()
2,先判斷計算機是大端還是小端。然後按照大小端列印出某種型別每個位元組資料。列印int arr = ;時,依次列印出1000 2000
void check_end1() }
列印資料的每乙個位。如:列印int時,將int分成4個位元組,由低位到高位依次列印。每個位元組8個位也是按低位到高位依次列印。
int print_bit(const char c1,size_t length)else if((c2&0x1)==0) }
void print_bit_all(void* inptr,size_t size)
c_ptr_size++;
c_ptr++; }
}3,char與int與char與string。
char與int沒有區別,它們之間可以相互強轉,都可以賦值為整數,字元。在記憶體中都以2進製儲存。char與int與short是一樣的關係。
char c2 = 'a';
int i2 = 0x12345678;
short s2 = 'a';
for (int i = 0; i < 4; i++)
如下的程式中,i1和i2的列印是同乙個值。對於字元來說,256是它的模,很明顯i1 i2的寫法中,
『a』進製了(小端模式下,至於是『a』還是『a』進製是由編譯器還是什麼決定,我也不清楚)。
int i1 = 'aa';
int i2 = 'a'*256 + 'a';
printf(" %d %d",i1,i2);//i1和i2的列印是同乙個值。
4,浮點數2進製儲存。
推薦閱讀:
浮點數使用乙個公式來計算值:浮點數=(−1)^s×m×2^e。
對於32位的浮點數,00000000 00000000 00000000 00000000。
[0(s)1位][0000000 0(e)8位][0000000 00000000 00000000(m)23位]
s是最高位,1為負數,0位正數。
e是最高位後的8個位。
m是其他的23位。
e:e為乙個無符號整數(unsigned int)。這意味著,如果e為8位,它的取值範圍為0~255;
但是,我們知道,科學計數法中的e是可以出現負數的,所以ieee 754規定,e的真實值必須再減去乙個中間數,
對於8位的e,這個中間數是127;比如,2^10的e是10,所以儲存成32位浮點數時,必須儲存成10+127=137,即10001001。
m:ieee 754規定,在計算機內部儲存m時,預設這個數的第一位總是1,因此可以被捨去,只儲存後面的******部分。
比如儲存1.01的時候,只儲存01,等到讀取的時候,再把第一位的1加上去。這樣做的目的,是節省1位有效數字。
以32位浮點數為例,留給m只有23位,將第一位的1捨去以後,等於可以儲存24位有效數字。
例:將10進製的-12.5儲存為2進製。
12 = 1100。整數部分按照正常情況儲存。
0.5 = 1。小數部分按照2^(-n)儲存。小數點後第1位為0.5(1/2),低2位為0.25(1/4),第3位為0.125(1/8)。
即:小數點後的二進位制.1就是十進位制0.5,二進位制.01就是十進位制0.25,二進位制.11就是十進位制0.75。
-12.5 = 1100.1。左移3位就是1.1001(需要去掉前面的1),e = 3 + 127 = 130 = 1000 0010。
最後為:1(符號位) 1000 0010(e的值) 10010000000000000000000(m的值)
例:將2進製的-12.5轉化回10進製。
將 1(符號位) 1000 0010(e的值) 10010000000000000000000(m的值) 轉化回-12.5 。
將該2進製浮點數分成3段,知道了符號為*-1,e = 120-127 = 3 。m = 1.1001(把1加回來)
根據e的值為3,m右移3位。(如果e的值為-3,那就是左移3位)。m = 1100.1 。分成整數和小數部分後,按照相應的公式得:1100 = 12 。1 = 0.5 。
指數e還可以再分成三種情況:
浮點數=(−1)^s×m×2^e。
1,e不全為0或不全為1。這時,浮點數就採用上面的規則表示,即指數e的計算值減去127(或1023),
得到真實值,再將有效數字m前加上第一位的1。
2,e全為0。這時,浮點數的指數e等於1-127,不是0-127,有效數字m不再加上第一位的1,而是還原為0.******的小數。
然後再左移126位,這樣做是為了表示±0,以及接近於0的很小的數字。如何出現:直接設定為0或者0.很小很小,列印出來就都為0 。
3,e全為1。這時,如果有效數字m全為0,表示±無窮大(正負取決於符號位s);
如果有效數字m不全為0,表示這個數不是乙個數(nan)。如何出現:即使設定乙個很大很大的數,也無法出現e全為1時的情況。
深入理解計算機作業系統(2 2 4)
在c語言中,對於有符號數和無符號數之間的轉換是從位級的角度來考慮的而不是從數級的角度來考慮的。簡單說就是,對於有符號數和無符號數之間的轉換,我們希望的是在可以表示的範圍內,數值表示不變,但是c語言中,是二進位制位不變,改變解釋二進位制位的方式。舉例 乙個8位的無符號數128,二進位制位是100000...
深入理解計算機作業系統(三)
基本資料型別 大小端模式 整型數範圍與c標準 複合型型別轉換 從short到unsigned 讓我們複習一下c語言中基本資料型別的位元組數 名稱32位 64位char11 short int22 int4 4long int48 long long int88 char 48 float44 dou...
深入理解計算機作業系統(九)
本文將介紹儲存器層次結構以及區域性性對程式效能的影響。什麼是儲存器層次結構?區域性性 這個詞大家也許並不陌生,計算機中的儲存器從暫存器 快取到記憶體 硬碟,形成了乙個層次結構。為什麼不用單一的一種儲存裝置,比如只用硬碟呢?因為每一種儲存裝置都有它的優缺點,硬碟雖然儲存空間大,但傳輸速率太慢,完全跟不...