1.char變為int時高位符號擴展問題
int main() { char a = 0x9a; int util; util = (int)a; if(util > 0) printf("positive\n"); else printf("negative\n"); return 0; }
0x9a --- 1001 1010 但是強制轉換的過程中,int是有符號的,需要對0x9a進行符號擴展,也就是用最高位1來擴展其他3個字節(架設int為4個字節)就會變成
1111111 11111111 11111111 10011010 (8為二進制數中最高位為符號位 默認就是1為負)所以上數是二進制補碼表示的-102
將 util = (int)a 修改為 util = (int)(unsigned char)a 即可!!
2.int轉為char時的數據流失
int main() { char c; while(c=getchar())!=EOF) putchar(c); return 0; }
各種系統都有自己默認的char類型,可能是unsigned char也可能是signed char.假設此處默認是unsigned char。
getchar()返回一個int型,將被強制轉換成unsigned char賦給c,這樣當getchar讀取完畢返回EOF (-1)的時候,轉換成unsigned char 后的ASCII的值是255。 然后,系統在比較c(unsigned char)和EOF 時,均被轉換為 unsigned int 來比較。前者是 (unsigned int)255 后者是(unsigned int )-1 ,但是8位的-1 和32 位的 -1差距卻很大,永遠不會相等,因此造成死循環!!
應該改成-->>
int main() { int c; while(c=getchar())!=EOF) putchar(c); return 0; }