• <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>

            chenglong7997

            chapter 7(可移植性缺陷)

            1.標示符名稱的限制

            ANSI C標準只保證了C實現(xiàn)必須能夠區(qū)別出前6個字符不同的外部名稱。而且這個定義中并沒有區(qū)分大寫字母與其對應的小寫字母。
            因此,編寫可移植程序必須小心這一點。

            2.字符是有符號的整數(shù),還是無符號的整數(shù)
            只有把一個字符值轉換為一個較大的整數(shù)時,才重要。在其他情況下,結果都是:多余的位被簡單的“丟棄”。

            在轉換過程中:應該將字符作為有符號數(shù)還是無符號數(shù)?
            如果有符號,編譯器將char數(shù)據(jù),擴展到int時候,應該復制符號位。
            如果無符號,編譯器只需在多余的位上填充0.
            #include <stdio.h>

            int main()
            {
                char c='a';
                c=c+40;
            //    printf("%c\n", -1); 
                printf("c %d\n", c);
                printf("unsigned c %u\n", (unsigned char)c);
            }
            結果:
            c -119
            unsigned c 137
            說明在gcc中,將char當做有符號數(shù)。在c+40的時候,超過了-128~127范圍,因此溢出。如果是無符號char,范圍是0~255.應該是輸出137.

            如果編程者關注一個最高位是1的字符是正還是負,可以設置為無符號字符數(shù)。這樣所有編譯器都會轉換為整數(shù)時候,填充為0.


            3.一個常見錯誤是:如果c是一個字符變量,使用(unsigned)c可以得到與c等價的無符號整數(shù)。這是會失敗的。因為在將c轉換為無符號整數(shù)時候,c將首先首先被轉換為int型整數(shù)。而此時可能得到非預期的結果。
            正確方法是:(unsigned char )c,直接進行轉換。

            例如上個例子中,最后一句改為:
            printf("unsigned c %u\n", (unsigned )c);

            那么結果是:
            c -119
            unsigned c 4294967177
            c被先轉換為int型-119,再求他的無符號表達形式,4294967177 

            4.移位運算符
               1.向右移位時,空出的位由0填充,還是由符號位的副本填充。
               2.如果是無符號數(shù),用0填充。如果是有符號數(shù),既可以用0也可以用符號位的副本。(如果關注右移時候空出的位,可以聲明為無符號類型,那么空出的位都會被設置為0)

               如果被移位對象為n位,那么移位計數(shù)必須大于或等于0,而嚴格小于n.
            即使C實現(xiàn)將符號位復制到空出的位中,有符號數(shù)的向右移位,也并不等于除以2的某次冪。例如(-1)>>1結果為-1,而不是-1/2 == 0

            5.隨機數(shù)最大值,RAND_MAX在limits中定義。我測試結果等于INT_MAX

            6.除法運算的截斷
            q=a/b;
            r=a%b;
            假定b>0.
            C語言定義只保證q*b+r=a,以及a>=0 且 b>0時,保證|r|<|b|以及r>=0.
            (如果a<0, 那么r也可能小于0)
            例如:
            int main() {
                // Start typing your code here
                
                cout<<(-3)/2<<endl;
                return 0;
            }
            結果商為-1,余數(shù)也為-1

            posted on 2012-06-25 07:10 Snape 閱讀(318) 評論(0)  編輯 收藏 引用 所屬分類: Traps

            導航

            <2012年6月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            統(tǒng)計

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            my

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久人人爽人人爽人人片AV不| 久久精品国产亚洲综合色| 久久综合亚洲色HEZYO国产| 久久精品国产亚洲AV不卡| 亚洲一级Av无码毛片久久精品| 久久99这里只有精品国产| 7777久久亚洲中文字幕| 精品久久久无码中文字幕| 国产精品久久婷婷六月丁香| 久久精品国产清高在天天线| 久久AⅤ人妻少妇嫩草影院| 狠狠精品久久久无码中文字幕| 久久精品国产亚洲网站| 久久丫忘忧草产品| 国产精品成人精品久久久| 午夜天堂精品久久久久| 久久本道综合久久伊人| 久久99国产乱子伦精品免费| 香蕉aa三级久久毛片| 亚洲欧美精品伊人久久| 亚洲午夜久久久影院伊人| 久久综合九色欧美综合狠狠| 99久久精品影院老鸭窝| 亚洲欧美成人综合久久久| 久久国产精品一区| 久久国产乱子伦精品免费强| 综合人妻久久一区二区精品| 性做久久久久久免费观看| 国产亚州精品女人久久久久久| 亚洲午夜久久久久久久久久| 99精品久久精品一区二区| 亚洲国产一成久久精品国产成人综合 | 亚洲国产一成久久精品国产成人综合| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 久久夜色精品国产噜噜亚洲AV| 亚洲国产成人久久精品99| 少妇久久久久久被弄到高潮 | 久久精品国产亚洲αv忘忧草| 日本精品久久久久影院日本| 久久久精品久久久久久| 亚洲精品国产综合久久一线|