EOF (as defined in the C language) is not a character/not an ASCII value. That’s why getc returns an int and not an unsigned char – because the character read could have any value in the range of unsigned char, and the return value of getc also needs to be able to represent the non-character value EOF (which is necessarily negative).