Это поведение не определено, зависит от реализации (glibc, а не gcc). Это плохая практика, полагаться на это, ИМО.
Если вы точно знаете, что ваша строка числовая (шестнадцатеричное здесь), вы можете написать:
printf("%016llX\n",strtoll(UPC,NULL,16));
Но помните об ошибках и переполнениях.
Редактировать, используя оригинальный постер:
Для десятичных чисел используйте следующее:
printf("%016llu\n",strtoll(UPC2,NULL,10));