• <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.標(biāo)示符名稱的限制

            ANSI C標(biāo)準(zhǔn)只保證了C實(shí)現(xiàn)必須能夠區(qū)別出前6個(gè)字符不同的外部名稱。而且這個(gè)定義中并沒(méi)有區(qū)分大寫字母與其對(duì)應(yīng)的小寫字母。
            因此,編寫可移植程序必須小心這一點(diǎn)。

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

            在轉(zhuǎn)換過(guò)程中:應(yīng)該將字符作為有符號(hào)數(shù)還是無(wú)符號(hào)數(shù)?
            如果有符號(hào),編譯器將char數(shù)據(jù),擴(kuò)展到int時(shí)候,應(yīng)該復(fù)制符號(hào)位。
            如果無(wú)符號(hào),編譯器只需在多余的位上填充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);
            }
            結(jié)果:
            c -119
            unsigned c 137
            說(shuō)明在gcc中,將char當(dāng)做有符號(hào)數(shù)。在c+40的時(shí)候,超過(guò)了-128~127范圍,因此溢出。如果是無(wú)符號(hào)char,范圍是0~255.應(yīng)該是輸出137.

            如果編程者關(guān)注一個(gè)最高位是1的字符是正還是負(fù),可以設(shè)置為無(wú)符號(hào)字符數(shù)。這樣所有編譯器都會(huì)轉(zhuǎn)換為整數(shù)時(shí)候,填充為0.


            3.一個(gè)常見(jiàn)錯(cuò)誤是:如果c是一個(gè)字符變量,使用(unsigned)c可以得到與c等價(jià)的無(wú)符號(hào)整數(shù)。這是會(huì)失敗的。因?yàn)樵趯轉(zhuǎn)換為無(wú)符號(hào)整數(shù)時(shí)候,c將首先首先被轉(zhuǎn)換為int型整數(shù)。而此時(shí)可能得到非預(yù)期的結(jié)果。
            正確方法是:(unsigned char )c,直接進(jìn)行轉(zhuǎn)換。

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

            那么結(jié)果是:
            c -119
            unsigned c 4294967177
            c被先轉(zhuǎn)換為int型-119,再求他的無(wú)符號(hào)表達(dá)形式,4294967177 

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

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

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

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

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

            導(dǎo)航

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

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            my

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国产69精品久久久久777| 久久精品国产免费观看 | 久久国产热精品波多野结衣AV| 久久久高清免费视频| 狠狠综合久久AV一区二区三区| 亚洲AV成人无码久久精品老人| 亚洲国产精品久久久久网站| 国产免费久久精品丫丫| yy6080久久| 久久久久国产日韩精品网站| 午夜天堂精品久久久久| 久久av高潮av无码av喷吹| 精品免费久久久久久久| 偷窥少妇久久久久久久久| 国产精品久久久久久久久免费| 2021国产精品午夜久久| 国产午夜电影久久| 97久久超碰国产精品旧版| 久久精品国产亚洲AV不卡| 日日狠狠久久偷偷色综合0| 9191精品国产免费久久| 久久久久久久97| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 久久99国产精品久久99小说| 人人狠狠综合久久亚洲88| 久久一日本道色综合久久| 久久久无码精品亚洲日韩京东传媒| 国产精久久一区二区三区| 久久综合综合久久狠狠狠97色88| 人妻无码中文久久久久专区| 国产亚洲精品久久久久秋霞| 中文字幕精品久久| 久久久亚洲AV波多野结衣| 亚洲综合久久夜AV | 色8激情欧美成人久久综合电| 久久综合伊人77777麻豆| 久久久不卡国产精品一区二区| 精品久久人人妻人人做精品 | 精品久久久久久国产免费了| 国产精品美女久久久免费| 久久久久久国产精品美女|