深入理解計算機系統 --- 信息的表示和處理

第一章對計算機做了個總體的介紹
接下來是深入講解每個部分

本章研究在計算機上如何表示數字和其他形式的數據的基本屬性
以及計算機對這些數據執行操作的屬性

這章我只是簡單的過一下
下一章 程序的機器級表示 會非常詳細

苦心人、天不負,臥薪嚐膽,三千越甲可吞吳

2.信息的表示和處理

現代計算機存儲和處理的信息以二值信號表示,二進制數字或稱爲位(bit)
當構造存儲和處理信息的機器時,二進制值工作得更好
二值信號能夠很容易地被表示,存儲,傳輸

孤立的講,單個的位不是非常有用,把位組合在一起,再加上某種解釋
即賦予不同的可能位模式以含義,我們就能夠表示任何有限集合的元素

研究三種最重要的數字表示
無符號(unsigned)編碼基於傳統的二進制表示法,表示大於或者等於零的數字
補碼(two’s-complement)編碼是表示有符號整數的最常見的方式,有符號整數就是正/負數字
浮點數(floating-point)編碼是表示實數的科學計數法的2爲基數的版本

計算機用這些不同的表示方法實現算數運算

計算機的表示法是用有限數量的位來對一個數字編碼
結果太大以至不能表示時,某些運算就會溢出(overflow),溢出會導致令人吃驚的結果

大量計算機的安全漏洞都是由於計算機算數運算的微妙細節引發

2.1信息存儲

大多數計算機使用8位的塊,或者字節(byte),作爲最小的可尋址的內存單元
而不是訪問內存中單獨的位

機器級程序將內存視爲一個非常大的字節數組,稱爲虛擬內存(virtual memory)
內存的每個字節都由一個唯一的數字來標識,稱爲它的地址(address)
所有可能的地址集合就稱爲虛擬地址空間(virtual address space)

這個虛擬地址空間只是一個展現給機器級程序的概念性映像
實際的實現是將動態隨機訪問存儲器(DRAM)、內存、磁盤存儲器等,操作系統軟件集合結合起來,爲程序提供一個看上去統一的字節數組

每個程序對象都可以簡單地視爲一個字節塊,而程序本身就是一個字節序列

2.1.1十六進制表示法

在這裏插入圖片描述
一個字節由8位組成,二進制表示法中,值域是00000000~11111111
用16進制書寫,一個字節的值域是00~FF

2.1.2字數據大小

每臺計算機都有一個字長(word size),指明指針數據的標稱大小(nomimal size)
虛擬地址是以這樣的一個字來編碼的,所以字長決定的最重要的系統參數就是虛擬地址空間的最大大小
一個字長爲x位的機器而言,虛擬地址的範圍爲2^x – 1,程序最多訪問2^x個字節

大多數64位機器也可以運行爲32位機器編譯的程序,這是一種向後兼容
64位機器編譯的程序,只能在64位機器上運行
因此,區分”32位程序”或“64位程序”時,區別在於程序是如何編譯的
而不是其運行的機器類型
在這裏插入圖片描述
計算機和編譯器支持多種不同方式編碼的數字格式,如不同長度的整數和浮點數
許多機器都有處理單個字節的指令,也有處理2字節,4字節或者8字節整數的指令
還有些指令支持表示爲4字節和8字節的浮點數

有些數據類型的確切字節數依賴於程序是如何被編譯的
整數或者爲有符號的,即可以表示負數,零和正數
或者爲無符號的,即只能表示非負數

注:關於有符號,無符號 我會補一個章節來詳解

2.1.3尋址的字節順序
對於跨越多字節的程序對象,必須建立兩個規則:
1.這個對象的地址是什麼
2.在內存中如何排列這些字節

幾乎在所有的機器上,多字節對象被存儲爲連續的字節序列
對象的地址爲所使用字節中最小的地址

假設一個類型爲int的變量x的地址爲0x100,那麼x的4個字節將被存儲在內存的
0x100、0x101、0x102、0x103位置
在這裏插入圖片描述
許多比較新的微處理器是雙端法(bi-endian),也就是可以把它們作爲大端或者小端的機器運行

2.1.4表示字符串

C語言中字符串被編碼爲一個null(值爲0)字符結尾的字符數組,每個字符都由某個標準編碼來表示,最常見的是ASCLL字符碼

2.1.5表示代碼

在這裏插入圖片描述
發現指令編碼是不同的,不同機器類型使用不同的且不兼容的指令和編碼方式
即使是完全一樣的進程,運行在不同的操作系統上也會有不同的編碼規則
因此,二進制代碼是不兼容的

計算機系統的一個基本概念就是,從機器的角度來看,程序僅僅只是字節序列
機器沒有關於原始源程序的任何信息,除了有些用來幫助調試的輔助表以外

2.1.6布爾代數簡介

邏輯值TRUE (真) 邏輯值FALSE (假)
在這裏插入圖片描述
and & 與運算。
相同位的兩個數字都爲1,則爲1;若有一個不爲1,則爲0。

or | 或運算。
相同位只要一個爲1即爲1。

xor ^ 異或運算。 真(1) 假(0)
真⊕假=真
假⊕真=真
假⊕假=假
真⊕真=假

2.1.7C語言中的位級運算

在這裏插入圖片描述

2.1.8C語言中的邏輯運算

在這裏插入圖片描述

2.1.9C語言中的移位運算

在這裏插入圖片描述
針對參數x的值,豎着看

2.2整數表示

本節中描述兩種用位來編碼整數的兩種不同的方式
一種只能表示非負數
一種能夠表示負數、零、正數
在這裏插入圖片描述
本節中描述兩種用位來編碼整數的兩種不同的方式
一種只能表示非負數
一種能夠表示負數、零、正數

2.2.1整型數據類型

C語言支持多種整型數據類型—表示有限範圍的整數
在這裏插入圖片描述
爲這些不同的大小分配的字節數根據程序編譯爲32位還是64位而有所不同
在這裏插入圖片描述


關於無符號有符號數,數據寬度

摘取:滴水逆向三期教程

在計算機中,受硬件的制約,數據都是有長度的(稱爲數據寬度)

關於有符號,無符號的概念,計算機不知道什麼是有符號,無符號
這是由使用者來定義的,你把它當成什麼看

在這裏插入圖片描述
無符號數:
0 1 2 3 4 ……. FF

有符號:
正數: 0 ……7F
負數:80 …… FF

無符號數,全是正整數和零
有符號數,負數,零,整數,如圖的左半球爲負數,右半球爲正整數和0

都說最高位爲1,代表的是負數,是在有符號數的情況下
如圖 8F – FF ,的二進制位最高位都爲1

在這裏插入圖片描述
32位和上邊的概念一樣,只不過能存儲的空間更大

邏輯運算

在這裏插入圖片描述
在這裏插入圖片描述
電路圖表示的非常有意思!

計算機是如何計算2+3的
首先兩個容器保存2和3的二進制數值

0010
0011

在這裏插入圖片描述
首先進行異或運算,得到結果0001,保存在一個容器裏
在這裏插入圖片描述
然後進行與運算,得到結果0010,左移1位爲0100 發現位全不是0,繼續運算
將上邊異或出來的結果,和左移的結果0100 進行異或運算
在這裏插入圖片描述
從我們眼觀來看,已經計算出正確結果了,但是計算機並不知道這是正確結果
在這裏插入圖片描述
然後又進行一層與運算,得到結果0000 左移一位 還是0000 就知道已經計算出正確結果了

原碼反碼補碼

原碼
最高位爲符號位,其餘各位爲數值本身的絕對值

反碼
正數:反碼與原碼相同
負數:符號位爲1,其餘位對原碼取反

補碼
正數:補碼與原碼相同
負數:符號位爲1,其餘位對原碼取反加1

正數都一樣
負數:補碼

-1
原碼:1 0 0 0 0 0 0 1
反碼:1 1 1 1 1 1 1 0
補碼:1 1 1 1 1 1 1 1

-6
原碼:1 0 0 0 0 1 1 0
反碼:1 1 1 1 1 0 0 1
補碼:1 1 1 1 1 0 1 0

在這裏插入圖片描述
-1,-6的十六進制分別爲
FF — 1111 1111
FA — 1111 1010
由此可見,負數是以補碼的形式

關於浮點數,看書瞭解詳情。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章