C+ +中char、unsigned char和signed char是三種類型,因此在函數(shù)重載和模板偏特化時(shí),應(yīng)注意重寫(xiě)它們的三個(gè)版本。雖然它們是三種類型,但char不是unsigned char就是signed char,且char是否有符號(hào)可由編譯器改變。因此不因編寫(xiě)依賴char是有符號(hào)還是無(wú)符號(hào)的代碼。
在C/C++語(yǔ)言中,char變量為一個(gè)字節(jié),8位,
signed char表示的范圍:-128~127【-128在內(nèi)存中的二進(jìn)制表示為1000 0000,127在內(nèi)存中的表示為0111 1111】;
unsign char表示的范圍:0000 0000~1111 1111,即0~255注意:整數(shù)在內(nèi)存中是以補(bǔ)碼存取的,正數(shù)的補(bǔ)碼:等于自己,負(fù)數(shù)的補(bǔ)碼:取反加1,例如:127在內(nèi)存中表示為0111 1111, -127在內(nèi)存中表示為~(0111 1111)+1=1000 0001; 假定某內(nèi)存單元p的內(nèi)容是1111 1111,那么它一定是255嗎?實(shí)際上取決于你的代碼是要把它看成有符號(hào)還是無(wú)符號(hào)數(shù),如果是無(wú)符號(hào)則表示255,如果是有符號(hào)則表示-1【對(duì)于有符號(hào)數(shù),最高位為符號(hào)位,1表示負(fù),0表示正】:
signed char c=*p; //c=-1
unsigned char c=*p;//c=255
這也解釋了上面這段代碼能判斷編譯器默認(rèn)char類型
在 char 、unsigned char、signed char三者相互轉(zhuǎn)換中,并不丟失數(shù)據(jù)
在實(shí)際工作中,char的用途還是很大的。以下將工作中遇到的問(wèn)題記錄。
1.unsigned char m_ucStr[] = {0x31,0x32}; 當(dāng)char里面是16進(jìn)制時(shí),內(nèi)存里面值是一樣的。

1.1 若想實(shí)現(xiàn)內(nèi)存里的數(shù)據(jù)是3132里
unsigned char *str = new unsigned char[sizeof(
m_ucStr)];
CopyMemory(str,array,sizeof(
m_ucStr));
2.unsigned char m_ucStr[] = {31,32}; 當(dāng)char里面是10進(jìn)制時(shí),內(nèi)存10進(jìn)制轉(zhuǎn)為16進(jìn)制
3.在進(jìn)制 char * 和 char *字符串復(fù)制時(shí),若不指定源字符串長(zhǎng)度,用 strcpy,若指定源字符串長(zhǎng)度,用strncpy.但當(dāng)源字符內(nèi)存有 0x00時(shí),則再也不能用 strcpy和strncpy了,只能用 memcpy.因?yàn)閙emcpy不以0x00為指定結(jié)束符