You answered your question. If you explicitly give the array a length, as in:
const char hex[16] = "0123456789ABCDEF";
then of course it will not be completed from zero because there is no storage reserved for zero completion. ( hex[16] is outside of the object and thus reading or writing is undefined behavior. If this happens as 0, then UB for ya ...)
This is only if you leave the length implicit, as in:
const char hex[] = "0123456789ABCDEF";
or if you use a string literal as an object, and not as an initializer, then it will have zero completion.
By the way, why do you care if there is zero termination or not if you do not plan to use it. Are you trying to shave bytes from your binary ?:-)
R ..
source share