程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 斯坦福大學開放課程:編程范式學習筆記《二》

斯坦福大學開放課程:編程范式學習筆記《二》

編輯:關於C

本課講述了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.XXXXX(0到1之間的數據)
最終浮點的值是,2的(exp - 127)次方 乘以 1.XXXX表示。


最後兩個例子表示值拷貝的過程。
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!

 


摘自 我的編程樂園

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved