• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-145  評論-173  文章-70  trackbacks-0
            本課講述了C/C++關(guān)于int,float等數(shù)據(jù)的底層表示,以及賦值操作所進(jìn)行的處理。本節(jié)內(nèi)容比較簡單,應(yīng)該屬于組成原理的基礎(chǔ)知識,各種碼的表示和底層實(shí)現(xiàn),但是,講述還不錯,特別是為何要這樣形成補(bǔ)碼,比單純記憶強(qiáng)多了,這樣才理解了取反加1的原因,比當(dāng)初上課的時候要理解深刻多了。

            bool    1byte
            char    1 byte
            short   2 bytes
            int        2-4 bytes
            float     4bytes
            double  8bytes

            binary  digit ==> bit
            1byte = 8種bit的組合,即共有2的8次方這么多種選擇。
            每一位都有權(quán)值,對應(yīng)的,2的0次方依次往上遞增。

            short:2 bytes表示,共有2的16次方表示
            但是并不是完全表示正數(shù),最開始的符號位,1為負(fù)數(shù),0為正數(shù)(實(shí)際上就是反碼的表示方法)
            缺陷: +7 + (-7),最終得到的數(shù)值用反碼來表示的話不是0。
            因此,計算機(jī)處理起來很麻煩,以備淘汰

            更優(yōu)的辦法是:補(bǔ)碼表示,取反加1.
            為何? 從計算機(jī)表示的角度出發(fā),+7 加上什么為0呢? 接近0的數(shù)是,全部為1的(-1),然后加上1就可以溢出符號位,從而表示為0.
            因此順理成章的,負(fù)數(shù)的表示就是,正數(shù)的基礎(chǔ)上,取反, 然后加1.

            一個例子:
            char ch = 'A';
            short s = ch;(不需要類型轉(zhuǎn)換)
            cout << s結(jié)果是,65.
            如何做的呢?計算機(jī),just copy 
            bit pattern copy的形式,不管你的類型如何,直接進(jìn)行拷貝,由于short比char多一個字符,所以拷貝的前一個byte直接用全0來復(fù)制。

            現(xiàn)在,另外考慮一個例子,截斷。
            short s = 67;
            char ch = s;
            問題是,short比char 要多一個byte,那么賦值的話,是盡可能的接近嗎?
            NO,計算機(jī)不懂值得大小,只會單純的copy,因此,截斷后面的1byte賦值過去而已。

            同樣的,講short賦值給int的時候也是這樣處理的,高位全部copy為0,地位直接copy。而int賦值給short的時候,就是單純的截斷處理而已。
            現(xiàn)在的問題來了,如果是負(fù)數(shù)呢?
            short s =-1;
            int i = s;
            這個時候,前面的高位字節(jié)直接賦值為0的話,事實(shí)上數(shù)值的大小是變化的。因此計算機(jī)的做法是,拷貝符號位復(fù)制到高位。這樣正數(shù),就是拷貝的0,所以高位全為0,而負(fù)數(shù)的話高位1,拷貝的話,高位全1.最終保證i的值仍然是-1.

            接下來學(xué)習(xí)float的表示。
            我們可以自定義一種解釋float的方法。權(quán)重依次降低,比如從2的31次方到2的0次方,變?yōu)?的29次方到2的-1次方,最開始的那一位表示為+/-符號位,這樣就可以表示一定的浮點(diǎn)數(shù),同樣的,再次降低權(quán)重就可以表示更低的數(shù)據(jù)了。
            但是,實(shí)際上計算機(jī)的表示不是這樣的

            采用了一種很奇怪的表示方法,即符號位(1位) + exp位(8位) + 浮點(diǎn)部分(23位)。
            符號位表示政府,exp為8位的正數(shù)表示,浮點(diǎn)數(shù)表示0.XXXXX(0到1之間的數(shù)據(jù))
            最終浮點(diǎn)的值是,2的(exp - 127)次方 乘以 1.XXXX表示。


            最后兩個例子表示值拷貝的過程。
            int i = 5;
            float f = i;
            輸出的結(jié)果是f仍然是5,why? 因?yàn)椴皇莃it copy,這里是直接進(jìn)行賦值,而類型不同,因此會先計算出來值得帶下,然后轉(zhuǎn)換一種類型表示出來。
            也就是把5的int類型表示為float的類型,bit pattern是完全發(fā)生了變化的。

            另外一個例子。
            int i = 37;
            float f = *(float *) &i;
            這種是把i的地址取出來,認(rèn)為它表示的是float,因?yàn)椋╢loat *)的作用,然后解釋為float類型輸出它的值,注意的是,bit pattern并不會發(fā)生變化。

            float f = 7.0;
            short s = *(short *) &f;
            由于是不同的類型,short只會截取自己那么大size的byte來進(jìn)行翻譯,所以float類型盡管4bytes,但是認(rèn)為是short類型的話,仍然截取的是2bytes。
            從而輸出short的值應(yīng)該是一個比較小的值。注意,bit pattern并不會改變,只是取出來地址而已。

            總結(jié)的關(guān)鍵是:just copy bit pattern!
            posted on 2012-05-13 18:03 deercoder 閱讀(2800) 評論(0)  編輯 收藏 引用 所屬分類: 大學(xué)公開課
            久久国产劲爆AV内射—百度| 久久精品无码一区二区三区| 久久久久18| 亚洲人AV永久一区二区三区久久| 一日本道伊人久久综合影| 伊人久久综合成人网| 久久精品国产一区| 97香蕉久久夜色精品国产| 狠狠色丁香婷婷综合久久来| 久久伊人中文无码| 久久精品成人免费看| 性做久久久久久久久浪潮| 青青草国产精品久久久久| 亚洲欧美成人久久综合中文网| 精品伊人久久大线蕉色首页| 99久久国产综合精品五月天喷水| 久久人人爽人人爽人人片AV不| 精品久久777| 伊人久久大香线蕉av不变影院 | 久久久久久国产精品免费免费| 久久无码AV一区二区三区| 91精品国产综合久久四虎久久无码一级 | 久久久久婷婷| 日韩欧美亚洲综合久久影院d3| 久久www免费人成看片| 亚洲综合久久夜AV | 国产成人精品综合久久久| 久久亚洲AV成人无码电影| 人妻无码αv中文字幕久久琪琪布| 青青青国产成人久久111网站| 精品久久久久久久无码 | 久久国产乱子精品免费女| 精品一二三区久久aaa片| 精品久久久久久无码不卡| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲国产成人久久综合一区77 | 国产韩国精品一区二区三区久久| 欧美国产成人久久精品| 久久久久久国产精品美女| 久久精品成人欧美大片| 久久久久综合网久久|