1. 程式人生 > >關於 char 和 unsigned char 的區別

關於 char 和 unsigned char 的區別

程序 大量 定義 錯誤 %x 關於 sign mem 比較

首先賣個關子:

為什麽網絡編程中的字符定義一般都為無符號的字符? char buf[16] = {0}; unsigned char ubuf[16] = { 0 }; 上面兩個定義的區別是: buf 是有符號類型的字符 ubuf 是五符號的字符

示例:

int main ( int argc, char *argv[] ) { unsigned char str[] = {0xde, 0xad, 0x2b, 0x6f}; char buf[16] = {0}; unsigned char ubuf[16] = { 0 }; //打印無符號的字符 memcpy (buf, str, 4); printf ("0buf is:0x%x\n", buf[0]); printf ("1buf is:0x%x\n", buf[1]); printf ("2buf is:0x%x\n", buf[2]); printf ("3buf is:0x%x\n", buf[3]); //打印有符號的字符 memcpy (ubuf, str, 4); printf ("0ubuf is:0x%x\n", ubuf[0]); printf ("1ubuf is:0x%x\n", ubuf[1]); printf ("2ubuf is:0x%x\n", ubuf[2]); printf ("3ubuf is:0x%x\n", ubuf[3]); return 0; } 打印結果: 0buf is:0xffffffde 1buf is:0xffffffad 2buf is:0x2b 3buf is:0x6f 0ubuf is:0xde 1ubuf is:0xad 2ubuf is:0x2b 3ubuf is:0x6f

說明

上面的結果反映了一個情況是 :str 的前兩個字符,在有符號和無符號打印的時候是不同的 為什麽不同? 因為前兩個字符的二進制最高位是 1 其他的字符在有符號和無符號時結果不影響,是二進制的最高位是0

註意點:

這個會有一個潛在的陷阱問題,就是做字符比較的時候 接著上面的例子: 有符號時 0xde == buf[0] =》 不成立 0xad == buf[1] =》 不成立 0x2b == buf[2] =》 成立 0x6f == buf[3] =》 成立 無符號時 0xde == ubuf[0] =》 成立 0xad == ubuf[1] =》 成立 0x2b == ubuf[2] =》 成立 0x6f == ubuf[3] =》 成立

總結

1. 在一般做字符操作的時候,需要區分無符號和有符號的情況。 2. 為了避免錯誤,程序中如果存在字符比較的時候,必須定義為無符號字符 3. 網絡編程中的字符定義一般都為無符號的字符,這個是因為存在大量的字符比較

關於 char 和 unsigned char 的區別