類型轉換中的符號擴展問題

由窄字節類型(如char)向寬字節類型(如int)轉換,會遇到符號位的擴展問題

例如

http://topic.csdn.net/u/20081030/15/aeae3a59-83da-41ba-83e3-9f13f0499fef.html

的例子

long __cdecl atol(const char *nptr)
{
        c=(int)(unsigned char)*nptr++;
while(isspace(c))
{
     ++nptr;
}
}

isspace(int)函數接受整形參數對nptr類型的轉換:確保從 *nptr++ 到 c 是進行零擴展而不是符號擴展,保證 c 中存放的是一個unsigned char 所能表示的值。http://topic.csdn.net/t/20061013/16/5080821.html符號擴展導致溢出的例子:
//unsigned
   char a = 0x80;//char的範圍是-128~127
printf("%x\n",a);//%x:16進制

printf( "%x\n ",a);實際上就是printf( "%x\n ",(int)a);

a由1一個字節擴展爲4個字節。因爲char默認爲signed,所以編譯器將進行符號位擴展
a:   1000   0000
(int)a:   1111   1111   1111   1111   1111   1111   1000   0000  

所以最終結果爲 0xffffff80





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章