使用 recvfrom 接收原始位元組資料存入 char readData[1024],列印時格式 %x 顯示第 6、7、8、20 位元為 ffffffc9、ffffffff 等負數十六進位。原因:**char 在此編譯器預設為有號**,數值 > 127 時最高位為 1,傳給 printf 時發生「整數提升」符號擴展為 32 位 0xFFFFFFXX。
unsigned char readData[1024] = {0};
// ...
printf("print_data[%d]:%02x\n", num, readData[num]);
unsigned char 範圍 0~255,無符號位,整數提升時高位補 0,%02x 正確顯示兩位十六進位(如 c9、ff)。char 但列印時強制轉型:printf("%02x", (unsigned char)readData[num])。uint8_t / unsigned char 代表原始位元組。%02x 並轉型 (unsigned char)。一行修改徹底解決「收到資料顯示負數」的經典 C 語言坑。