計算機的本質就是二進制,0/1,稱之為bit(位),一個位沒有什么意義,當同時擁有多個位,并且加上某種解釋,就可以表示任何有限集合的元素。(為什么是有限?因為用bit來表示元素是有限的,bit的組合數量是由bit數決定的,例如8個bit,那么所能表示的組合就是2^8種。即使bit次數增加,總數仍然是有限的,所以能表示集合元素數量也是有限的)。
計算機的表示法就是用有限的位對數字進行編碼,因此,當結果太大就會“溢出”。比如3位模式下的最大值是111也就是7,111+1就會變成1000,把最高位抹去,就是0。
信息存儲:
大多數計算機把8bit封裝成一個塊(字節),作為內存中的最小可尋址單元,而不是訪問內存中單獨的位
程序把內存抽象成一個字節數組(虛擬內存);內存中的每一個字節用一個唯一的數字表示(這里可能有異議,地址不都是:0x12fd1b……這樣的形式嗎,這是16進制表示法,換算成10進制就是數字),稱為地址。所有可能的地址集合就是虛擬地址空間。
每個程序對象(程序數據、指令和控制信息)可以看成一個字節塊,程序本身就是一個字節序列。
C語言的指針的指向就是某個程序對象的首地址。
二進制太冗長,10進制和二進制轉換又麻煩,所以引入16進制(0x),一個16進制位可以表示4位二進制,從右往左分配,到后面不足4位往左補0;(i+4j——2^11=3+2*4——0x800);?進制轉換
計算機的字長:
每個計算機都有一個字長,這個字長也就是我們常說的64位機器,32位機器。虛擬地址就是這樣一個字來編碼的(8字長就是64位,4字長就是32位),字長決定虛擬地址空間大小。32位程序可以運行在64位機器,但是64位程序只能在64位機器(向后兼容,但是沒有向前兼容)。32位程序和64程序的區別只是在于如何編譯,而不是運行機器類型。
尋址和字節順序:
對于跨越多字節的程序對象,要建立兩個規則:1這個對象的地址是什么? ? 2在內存中如何排列這些字節。多字節對象被存儲為連續的字節序列,對象的地址就是首地址(最低的)。
考慮一個整數轉化為w位的二進制,如果w是8的倍數,這些位就會被分組成為字節,因為一個字節8位,最高有效字節就是最前面8個位,最低有效字節就是最后面8個位,其他字節包含中間位。
大端法:最高有效字節存儲在最前面也就是低地址處;小端法:最低有效字節存儲在低地址處。
表示字符串:
文本數據比二進制數據有更強的平臺獨立性:文本本質上也是二進制數據,但是已經封裝成一個個規則(ASCII,UTF-8等),所以不同平臺系統處理這些數據會有一致的方式,背后的地址數據在不同平臺差異較小;
但是二進制數據,在不同平臺系統中,大小端,數據類型的字節長度和解釋方式都有差異,背后的地址規則更別說了。
布爾代數:略
整數表示:
這小節沒啥說的,都要靠算
T和U轉換:對于C語言來說:位模式不變,但是解釋的方式變。