1. 程式人生 > >【2】信息的表示和處理

【2】信息的表示和處理

float 執行 單獨 因此 com alt 卡片 acl AC

1.現代計算機存儲和處理的信息都以二值信號表示。

2.機器為什麽要使用二進制進行存儲和處理?

答:二值信號能夠很容易的被表示、存儲、傳輸。例如:

可以表示為穿孔卡片上有洞和無洞、導線上的高壓和低壓,順逆時針的磁場。

3.大多數機器使用8位的塊或者byte(字節),作為最小可尋址的內存單位,而不是訪問內存中的單獨位。

4.機器級程序將內存視為一個非常大的字節數組,稱為虛擬內存

內存的每個字節都由唯一的數字來標識,稱它為地址

所有的地址集合就稱為虛擬地址空間。

5.根據機器的不同,我們可以將存儲順序分為大端法小端法

大端法:字節值從小到大的排序。

技術分享圖片

小端法:字節值從大到小的排序。

技術分享圖片

大多數的inter兼容機都只用小端模式;

IBM和Oracle大多數機器按大端模式操作;

安卓和IOS都只能運行小端模式。

一旦選擇特定的操作系統,那麽字節的順序就固定下來了。

PS:至今也沒確定統一的字節順序,所以可以根據存儲的數據不同,選擇相應機器,可提高性能,也可以買雙端法的處理器。

下面使用代碼測試不同系統的端顯示:

環境:windwos10 64位 處理器:Inter I7-7500U

技術分享圖片

運行結果:

技術分享圖片

結果:int和float的結果是一樣的,指針值和機器相關。

值12345的int十六進制表示為0x00003039.

可以看出在windows系統上最低的字節值0x39最先輸出,所以windows使用的小端法。

其他小端法系統為Linux32,linux64。

在sun為大端法機器。

6.不同的機器類型使用不同的且不兼容的指令和編碼方式;

即使是完全一樣的進程,運行在不用系統上也會有不同編碼規則,因此二進制代碼是不兼容的。

二進制代碼很少能在不同機器和操作系統組合之間移植。

7.確定一個位級表達式的結果的最好方法就是將十六進制參數擴展了二進制表示並執行二進制運算,然後轉回十六進制。

8.補碼,位運算。

根據補碼轉換無符號數公式:

    x+2w x<0

T2Uw(x)=

      x, x≥0

x T2U4(x)

-8 7

-3 13

5 5

還有無符號轉換為補碼等公式不一一列舉了,具體請看該書。

其他:

(摘自其他博主 https://www.cnblogs.com/tjudzj/p/4190878.html)

補碼:

(1)正數的補碼:與原碼相同(已知原碼求補碼)

    例如:+9的原碼是0000 1001。補碼也是0000 1001。

(2)負數的補碼:符號位為1,其余位為該數絕對值的原碼按位取反,然後整個數加1。

    例如:-7原碼為1000 0111(高位為符號位,1表示負數,0表示正數),補碼為1111 1001.

位運算:

(1)正數右移位(以85為例,可以視作int 、long、uint、ulong之一,按哪個規則都行)

        85的二進制表示:      0000 0000 0000 0000 0000 0000 0101 0101

        85右移(>>)3位: 0000 0000 0000 0000 0000 0000 0000 1010

        移位後的結果十進制表示: 10

    (2)負數右移位(以-85為例,可以視作int 、long之一,此處視為int,32位)

        -85的二進制補碼表示:      1111 1111 1111 1111 1111 1111 1010 1011

        -85左移(>>)3位:       1111 1111 1111 1111 1111 1111 1111 0101

        移位後結果的原碼表示:      1000 0000 0000 0000 0000 0010 0000 1011

        移位後的結果十進制表示:     -11

最後,第二章習題太多,具體請看該書並實現。

【2】信息的表示和處理