K&R を読んでいたとき、次のコードで混乱しました。
#include "syscalls.h"
int getchar(void)
{
char c;
return (read(0, &c, 1) == 1) ? (unsigned char)c : EOF;
}
このコードでは、符号拡張による誤りを避けるために unsigned char を使用していると言われています。これは私が考えることができる唯一のケースであり、このサンプルコードを示します:
char c = 0xf0; //11110000, just make highest bit > 1
printf("%i\n",(int)(unsigned char)c);
printf("%i\n",(int)c);
Output: 240 // 0...011110000
-16 // 1...111110000
しかし、実際には ascii は 0~127 であり、最上位ビットを 1 に割り当てることはできません。なぜ K&R では char >> unsigned char をキャストするのですか?