首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言接收網路資料顯示負數:char 有號導致高位元擴展,改用 unsigned char

     編輯:程式設計綜合問答

使用 recvfrom 接收原始位元組資料存入 char readData[1024],列印時格式 %x 顯示第 6、7、8、20 位元為 ffffffc9、ffffffff 等負數十六進位。原因:**char 在此編譯器預設為有號**,數值 > 127 時最高位為 1,傳給 printf 時發生「整數提升」符號擴展為 32 位 0xFFFFFFXX。

解決方法:改用 unsigned char

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 語言坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved