• <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實現必須能夠區別出前6個字符不同的外部名稱。而且這個定義中并沒有區分大寫字母與其對應的小寫字母。
            因此,編寫可移植程序必須小心這一點。

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

            在轉換過程中:應該將字符作為有符號數還是無符號數?
            如果有符號,編譯器將char數據,擴展到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當做有符號數。在c+40的時候,超過了-128~127范圍,因此溢出。如果是無符號char,范圍是0~255.應該是輸出137.

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


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

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

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

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

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

            5.隨機數最大值,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,余數也為-1

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

            導航

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            my

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            99久久精品日本一区二区免费| 97久久精品人人做人人爽| 国内精品久久国产| 亚洲人成精品久久久久| 久久久一本精品99久久精品66| 国产欧美久久一区二区| 中文国产成人精品久久亚洲精品AⅤ无码精品| 色8激情欧美成人久久综合电| 大香伊人久久精品一区二区| 久久99热精品| 精品久久人人爽天天玩人人妻 | 亚洲一本综合久久| 人人狠狠综合久久亚洲| 97久久久精品综合88久久| 蜜桃麻豆www久久国产精品| 久久婷婷激情综合色综合俺也去| 精品久久久久久无码人妻热| 久久精品成人欧美大片| 欧美激情精品久久久久久久九九九| 久久久久亚洲Av无码专| 久久久久久精品免费看SSS| 四虎国产精品免费久久5151| 狠狠综合久久综合88亚洲| 婷婷久久综合| 久久婷婷人人澡人人| 精品久久久久久国产牛牛app | 国产精品日韩深夜福利久久| 少妇高潮惨叫久久久久久| 亚洲国产视频久久| 久久综合精品国产一区二区三区| 久久精品国产影库免费看| 久久99精品国产| 国产69精品久久久久9999| 国产精品亚洲美女久久久| 91秦先生久久久久久久| 国产一区二区精品久久凹凸 | 久久九九亚洲精品| 精品久久久久久久| 国产精品免费久久久久久久久 | 午夜精品久久久久久久无码| 久久99精品九九九久久婷婷|