всегда делаю каст в unsigned char - никогда UB не возникало
в основном определяют по типам указателей, но есть исключение для char типов (все три вида), std::byte и void, если встретится указатель на char и любой другой, компилятор может предполагать что указатели могут указывать на одно и тоже и не оптимизировать, если же указатель на char заменить указателем на char8_t то компилятор будет вправе считать что указатели всегда указывают на разные объекты