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

            導航

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

            統計

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            my

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久久国产精品美女| 久久国产免费观看精品| 亚洲综合久久夜AV | 精品伊人久久久| 久久久久久午夜成人影院| 99久久精品国产麻豆| 日韩中文久久| 久久精品人人做人人妻人人玩| 精品久久人妻av中文字幕| 99热成人精品免费久久| 日韩精品久久久久久久电影| 国产精品久久久久AV福利动漫| 亚洲天堂久久精品| 97久久天天综合色天天综合色hd| 国产精品久久久久久久久软件 | 久久久精品人妻一区二区三区蜜桃| 久久亚洲精精品中文字幕| 久久久久九国产精品| 色综合合久久天天综合绕视看| 久久久久久久波多野结衣高潮| 久久精品亚洲欧美日韩久久| 久久91综合国产91久久精品| 久久精品天天中文字幕人妻| 久久精品夜夜夜夜夜久久| 久久久无码一区二区三区| 狠狠色丁香久久婷婷综合五月| 蜜臀久久99精品久久久久久小说 | 久久亚洲私人国产精品| 色婷婷综合久久久久中文| 久久久噜噜噜久久中文福利| 久久久久久久亚洲Av无码| 久久精品国产久精国产| Xx性欧美肥妇精品久久久久久| 国产精品欧美久久久久无广告| 久久精品国产只有精品66| 久久精品aⅴ无码中文字字幕不卡| 亚洲国产精品无码久久久秋霞2| 久久天堂AV综合合色蜜桃网| 久久精品国产一区二区三区不卡| 亚洲va久久久久| 久久婷婷色香五月综合激情|