概述
現代計算機存儲和處理信息以二值信號表示。這些二進制數字形成了數字革命的基礎
二值信號能夠容易地被表示、存儲和傳輸,例如穿孔卡片上有洞或無洞、導線上的高低電壓、磁場的順時針或逆時針
三種最重要的數字表示:
1. 無符號編碼基於傳統的二進制表示法,表示大於或者等於零的數字
2. 補碼的編碼是表示有符號整數的最常見的方法,有符號整數就是可以爲正或爲負的數字
3. 浮點數編碼是表示實數的科學計數法的以2爲基數的版本
計算機表示法是用一個有限數量的位來對一個數字進行編碼,因此,當結果太大,會導致溢出(overflow)
整數的表示雖然只能編碼一個相對較小的數值範圍,但是這種表示是精確的
浮點數雖然可以編碼一個較大的數值範圍,但是這種表示只是近似的
1.信息存儲
字節(8位):是最小的可尋址的內存單位,而不是訪問內存中單獨的位。機器級的程序將內存視爲一個非常大的字節數組,稱爲虛擬內存。內存的每個字節都由一個唯一的數字來標識,稱爲它的地址,所有可能的地址集合就稱爲虛擬地址空間
C語言中指針的作用
指針是C語言中一個重要的特性。它提供了引用數據結構(包括數組)的元素的機制。與變量類似,指針也有兩個方面:值和類型。它的值表示某個對象的位置,它的類型表示在那個位置上所存儲對象的類型
-
十六進制表示法(一個字節由8位組成)
- 二進制表示(2爲基數):值域:00000000 ~11111111
- 十進制表示(10爲基數):值域:0~255
- 16進制(hex)表示(16爲基數):值域:00~FF
十六進制與二進制轉換:
1. 十六進制轉二進制(展開每個16進制數) 16進制數字0x173A4C 十六進制 1 7 3 A 4 C 二進制 0001 0111 0011 1010 0100 1100 2. 二進制轉十六進制 (將它分爲每4位一組來轉換爲16進制,如果位總數不是4的倍數,最左邊的一組可以少於四位,前面用0補足) 一個二進制數1111001010110110110011 二進制 11 1100 1010 1101 1011 0011 十六進制 3 C A D B 3
-
字數據大小
-
字長,指明指針數據的標稱大小。因爲虛擬地址是以一個字來編碼的,所以字長決定的最重要的系統參數就是虛擬地址空間的最大的大小。對於一位字長位w位的機器而言,虛擬地址的範圍是0~2w-1,程序最多訪問2w個字節
-
大多數64位機器也可以運行32位機器編譯的程序,這是向後兼容。
- Linux> gcc -m32 prog.c 該程序可以在32位或64位機器上運行
- Linux> gcc -m64 prog.c 該程序只可以在64位機器上運行
稱程序位"32位程序"或"64位程序"時,區別在於該程序是如何編譯的,而不是其運行的機器類型
數據類型 long 一般在32位程序中爲4字節,在64位程序中爲8字節- 爲了避免由於依賴"典型"大小和不同的編譯器設置帶來的奇怪行爲,ISC C99引入了一類的數據類型,其數據的大小是固定的,不隨編譯器和機器的設置而變化。
- 大部分數據類型都編碼爲有符號數值,除非前綴有關鍵字unsigned或對確定大小的數據使用了特定的無符號聲明
聲明指針
對於任何數據類型T,聲明 T * p,聲明p是一個指針變量,指向一個類型爲T的對象 -
尋址和字節順序
- 對於跨越多字節的對象,我們必須建立兩個規則:這個對象的地址是什麼,以及在內存中如何排列這些字節。在所有的機器上,多字節對象都被存儲爲連續的字節序列,對象的地址爲所使用字節中最小的地址
- 小端法:最低的有效字節存儲在低地址
大端法:最高的有效字節存儲在低地址
如:一個十六進制數:0x01234567
新的處理器是雙端法,因此可以把他們配置成作爲大端或小端的機器運行。然而,一旦選擇了操作系統,那麼字節的順序就固定了下來 - 對於大多數應用程序的程序員來說,其機器使用的字節順序是完全不可見的。無論爲那種類型的機器所編譯的程序都會得到相同的結果。
字節順序成爲問題的三個方面:- 不同類型的機器之間通過網絡傳送二進制數據,比如小端法的機器將產生的數據發送到大端法機器或者放過來
- 閱讀表示整數數據的字節序列。當閱讀小端法機器生成的機器級程序表示時,經常將字節按照相反的順序顯示。正常書寫字節序列時最高有效位在左邊,最低有效字節爲在右邊,而小端法相反
- 當編寫規避正常的類型系統的程序時。在C語言中,可以通過使用強制類型轉化或聯合來允許以一種數據類型引用一個對象,而這種數據類型和創建這個對象時定義的數據類型不同。
- 補充知識:
- 使用typedef來命名數據類型
C語言中的typedef聲明提供了一種給數據類型命名的方式。
如:typedef int *int_pointer - 使用printf格式化輸出
Printf函數的第一個參數時格式串,而其餘的參數都是要打印的值。在格式串裏,每個以"%"開始的字符序列都表示如何格式化下一個參數。如%d時輸出一個十進制數,%f時輸出一個浮點數,%c是輸出一個字符
- 使用typedef來命名數據類型
-
表示字符串
C語言中字符串被編碼爲一個以null(其值爲0)字符結尾的字符數組。最常見的編碼標準是ASCII編碼
在使用ASCII作爲字符碼的的任何系統上都將得到相同的結果,與字節順序和字大小規則無關。因而,文本數據比二進制數據更具有跨平臺性 -
表示代碼
不同的機器類型使用不同的且不兼容的指令和編碼方式。即使是完全一樣的進程,運行在不同的操作系統之上也會有不同的編碼規則,因此二進制代碼是不兼容的。二進制代碼很少能在不同機器和操作系統組合之間相互移植 -
布爾代數簡介
- 布爾運算~對應於邏輯運算的NOT,在命題邏輯中用符號¬表示
- 布爾運算&對應於邏輯運算的AND,在命題邏輯中用符號∧表示
- 布爾運算|對應於邏輯運算的OR,在命題邏輯中用符號∨表示
- 布爾運算^對應用邏輯運算異或,在命題邏輯中應用符號⊕表示
- 位向量
位向量就是固定長度的w、由0和1組成的串。位向量的運算可以定義成參數的每個對應元素之間的運算
- 布爾運算~對應於邏輯運算的NOT,在命題邏輯中用符號¬表示
-
C語言中的位級運算
C語言的一個很有用的特性是它支持按位布爾運算。
|是OR(或) &是AND(與) ~是NOT(取反) ^是EXCLUSIVE-OR(異或)
位級運算常見用法就是實現掩碼運算,這裏的掩碼是一個位模式,表示從一個字中選出的位的集合 -
C語言中的邏輯運算
C語言還提供了一組邏輯運算符||、&&和!,分別對應於命題邏輯中的OR、AND和NOT運算。邏輯運算認爲所有非零的參數都表示位TRUE,而參數0表示FALSE。它們返回0或者1,分別表示結果爲TRUE或者爲FALSE -
C語言中的移位運算
C語言還提供了一組移位運算,分別爲左移和右移- 左移:x向左移動k位,丟棄最高的k位,並在右端補k個0
- 右移:邏輯右移:在左端補k個0
算數右移:在左端補k個最高的有效位的值
對於無符號數,右移必須是邏輯的
-