Я согласен с вашим пониманием пункта 8. Стандарт гласит
Если и операнд-указатель, и результат указывают на элементы одного и того же объекта массива или один после последнего элемента объекта массива, при оценке не должно быть переполнения; в противном случае поведение не определено.
Кажется, что C предполагает, что в массиве нет переполнения указателей, поэтому вы можете увеличивать / уменьшать указатели, оставаясь внутри массива. Если указатель результата покидает массив, может произойти переполнение и поведение не определено.
Что касается параграфа 9, я полагаю, что стандарт учитывает, что вы, например, можете иметь архитектуру, которая предоставляет 32-битные указатели и 32-битные типы данных, но поскольку различие двух 32-битных указателей фактически является знаком плюс 32-битный (то есть 33 бита), не каждая разность указателей может совпадать с 32-битным ptrdiff_t. С архитектурой 2 дополнения это не проблема, но это может быть проблемой на других архитектурах.