Относительно 1)
Люди часто используют массивы символов, когда им действительно нужен байтовый буфер для потока данных. Это не очень хорошая практика, но многие проекты делают это, и если вы будете осторожны, никакого реального вреда не будет. Возможно, есть и другие времена.
В отношении 2)
Знаковые целые числа часто расширяются знаком, когда они перемещаются из меньшего типа данных. таким образом
11111111b (-1 в базе 10) становится 11111111 11111111 11111111 11111111 при расширении до 32 бит. Однако, если символ должен был быть без знака +255, то целое число со знаком может в конечном итоге составить -1.
О переносимости 3)
Некоторые машины рассматривают символы как целые числа со знаком, тогда как другие интерпретируют их как беззнаковые. Это также может варьироваться в зависимости от реализации компилятора. Большую часть времени вам не нужно беспокоиться об этом. Керниган просто пытается помочь вам понять детали.
Редактировать
Я знаю, что это нерешенная проблема, но вы можете использовать следующий код, чтобы проверить, подписаны или не подписаны символы в вашей системе:
#include <limits.h> //Include implementation specific constants (MAX_INT, et c.)
#if CHAR_MAX == SCHAR_MAX
// Plain "char" is signed
#else
// Plain "char" is unsigned
#endif