In
printf("uint8_t 0x%x\n", (uint8_t) X);
uint8_t
определенно является более ранним типом, чем int
, и поэтому uint8_t
будет повышен до int
и "%x"
будет работать.
//potentially invokes UB depending on platform
printf("uint32_t 0x%x\n", (uint32_t) X);
- это непереносимый код.Теоретически вы не знаете, что такое реальный тип uint32_t
, поэтому вам следует использовать макрос PRIx32
из inttypes.h
.Для согласованности / простоты вы можете использовать PRIx8
и uint8_t
.
#include <inttypes.h>
#include <stdio.h>
int main()
{
uint32_t X = 0xAABBCCDD;
printf("uint8_t 0x%" PRIx8 "\n", (uint8_t) X);
printf("uint32_t 0x%" PRIx32 "\n", (uint32_t) X);
}