由窄字節類型(如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