為什麼要使用資料型態比較長的 int?
char 資料型態只用一個 byte 來記錄資料。 它相當於 1-byte 或 8-bit 的整數資料型態,故只能記錄 -128 到 127 的整數。 雖然標準的 ASCII 碼只有 0 到 127,也就是 MSB = 0 的情形。 但是現在許多的字碼都用到 MSB = 1 的位元組 (bit pattern), 例如 Latin-1 和 Big-5 碼。 所以,代表檔案結束的 EOF 就不能與所有這些碼衝突。 否則,讀到這個字碼,就會務以為檔案結束。 因此,最安全的做法就是,使用比 char 更大的整數資料型態來記錄 EOF。 這就是為什麼我們宣告 c 的資料型態是 int 而非 char。 利用
printf("%d\n", EOF);
我們看到 EOF 只是一個符號常數,它就是 -1。 如果將 c 宣告成 char, 它的位元組就是 11111111 (二補數記錄 -1)。 這個位元組與 extended ASCII 碼的 255 號是一樣的, 電腦將無法分辨它們的不同 (電腦其實只認得位元組)。 於是,如果輸入的檔案中有 extended ASCII 255 字元 (y 上面加兩點), 就會誤判為檔案結束。 如果將 c 宣告成 int, 則若讀到普通字元,例如 A 的字碼,c 的位元組就是
例如讀到 extended ASCII 255 號字元,c 的位元組就是
若讀到 EOF,則c 的位元組就是
這就絕對不會混淆。
putchar 就反過來。 它如果得到一個 char 型態的資料,那沒問題。 但是如果它得到一個 int 型態的資料,就像前面那個程式, 則它會只取最小的 8 個 bits 送出去。 這就是為什麼可以寫 putchar(c);
請先 登入 以發表留言。