史丹福大學開放課程 程式設計正規化學習筆記《二》

2021-06-06 17:19:31 字數 2236 閱讀 2081

史丹福大學開放課程:程式設計正規化學習筆記《二》

本課講述了c/c++關於int,float等資料的底層表示,以及賦值操作所進行的處理。本節內容比較簡單,應該屬於組成原理的基礎知識,各種碼的表示和底層實現,但是,講述還不錯,特別是為何要這樣形成補碼,比單純記憶強多了,這樣才理解了取反加1的原因,比當初上課的時候要理解深刻多了。

bool    1byte

char    1 byte

short   2 bytes

int        2-4 bytes

float     4bytes

double  8bytes

binary  digit ==> bit

1byte = 8種bit的組合,即共有2的8次方這麼多種選擇。

每一位都有權值,對應的,2的0次方依次往上遞增。

short:2 bytes表示,共有2的16次方表示

但是並不是完全表示正數,最開始的符號位,1為負數,0為正數(實際上就是反碼的表示方法)

缺陷: +7 + (-7),最終得到的數值用反碼來表示的話不是0。

因此,計算機處理起來很麻煩,以備淘汰

更優的辦法是:補碼表示,取反加1.

為何? 從計算機表示的角度出發,+7 加上什麼為0呢? 接近0的數是,全部為1的(-1),然後加上1就可以溢位符號位,從而表示為0.

因此順理成章的,負數的表示就是,正數的基礎上,取反, 然後加1.

乙個例子:

char ch = 'a';

short s = ch;(不需要型別轉換)

cout << s結果是,65.

如何做的呢?計算機,just copy 

bit pattern copy的形式,不管你的型別如何,直接進行拷貝,由於short比char多乙個字元,所以拷貝的前乙個byte直接用全0來複製。

現在,另外考慮乙個例子,截斷。

short s = 67;

char ch = s;

問題是,short比char 要多乙個byte,那麼賦值的話,是盡可能的接近嗎?

no,計算機不懂值得大小,只會單純的copy,因此,截斷後面的1byte賦值過去而已。

同樣的,講short賦值給int的時候也是這樣處理的,高位全部copy為0,地位直接copy。而int賦值給short的時候,就是單純的截斷處理而已。

現在的問題來了,如果是負數呢?

short s =-1;

int i = s;

這個時候,前面的高位位元組直接賦值為0的話,事實上數值的大小是變化的。因此計算機的做法是,拷貝符號位複製到高位。這樣正數,就是拷貝的0,所以高位全為0,而負數的話高位1,拷貝的話,高位全1.最終保證i的值仍然是-1.

接下來學習float的表示。

我們可以自定義一種解釋float的方法。權重依次降低,比如從2的31次方到2的0次方,變為2的29次方到2的-1次方,最開始的那一位表示為+/-符號位,這樣就可以表示一定的浮點數,同樣的,再次降低權重就可以表示更低的資料了。

但是,實際上計算機的表示不是這樣的

採用了一種很奇怪的表示方法,即符號位(1位) + exp位(8位) + 浮點部分(23位)。

符號位表示正負,exp為8位的正數表示,浮點數表示0.***xx(0到1之間的資料)

最終浮點的值是,2的(exp - 127)次方 乘以 1.***x表示。

最後兩個例子表示值拷貝的過程。

int i = 5;

float f = i;

輸出的結果是f仍然是5,why? 因為不是bit copy,這裡是直接進行賦值,而型別不同,因此會先計算出來值得帶下,然後轉換一種型別表示出來。

也就是把5的int型別表示為float的型別,bit pattern是完全發生了變化的。

另外乙個例子。

int i = 37;

float f = *(float *) &i;

這種是把i的位址取出來,認為它表示的是float,因為(float *)的作用,然後解釋為float型別輸出它的值,注意的是,bit pattern並不會發生變化。

float f = 7.0;

short s = *(short *) &f;

由於是不同的型別,short只會擷取自己那麼大size的byte來進行翻譯,所以float型別儘管4bytes,但是認為是short型別的話,仍然擷取的是2bytes。

從而輸出short的值應該是乙個比較小的值。注意,bit pattern並不會改變,只是取出來位址而已。

總結的關鍵是:just copy bit pattern!

程式設計正規化 史丹福大學 學習筆記《三》

本課繼續講解了c語言的強制型別轉換,之後介紹了結構體,陣列以及結構體中的陣列。和 的技巧 例1 double d 3.1416 char ch char d 取出d的位址,並重新解釋為char型,然後解引用。由於double為8bytes,而char為1bytes,因此ch表示的是原來double中...

程式設計正規化 史丹福大學 學習筆記《九》

接下來的課程會涉及到計算機體系結構和組合語言,解釋c c 片段是如何編譯成彙編 的,記憶體模型,函式呼叫,函式返回的型別等。4位元組變數的例子 int i int j i 10 j i 7 j 對應的彙編 m r1 4 10 store operation 將棧段中某個區域的值進行了更新 r2 m ...

《程式設計方法學》史丹福大學

程式設計方法學 史丹福大學 網易公開課 感悟 1.for 語句,可以使用i,j,k 變數 不需該意使用有意名字的變數 顯示它只是 計算器 一自就明白 2.注釋 一定要加注釋 3.使用長量 列舉 不建議使用全域性變數 4.函式 函式中定義變數和外部變數同名時,內部函式有效 變數名相同,但函式外和函式內...