避免用char型別作為陣列小標
阿新 • • 發佈:2019-01-23
在統計字串的時候常用陣列來統計,字元為陣列下標,如求字串中第一個不重複(只出現過一次)的字元
但是字元的型別是char型別可能為負數,不能做下標。
不能把char強轉成 unsigned int 做下標,因為型別提升的時候,是按照高位填充的多餘位元組,如果char本身為負數,第8位就是1,轉成 unsigned int 或者int時多出來的三個位元組都是填充1;如果是0,則都填充0
如 char c=-128 ,記憶體中二進位制位 10000000 ,十六進位制為 0x80
無是提升為unsigned int 還是 int ,其記憶體都是 11111111 11111111 11111111 10000000 即0xffffff80
int main() { char c = -128; unsigned int uint = c; cout << uint << endl; printf("%u\n", uint); printf("%d\n", uint); uint = (unsigned int)c; cout << uint << endl; printf("%u\n", uint); printf("%d\n", uint); int tint = c; cout << tint << endl; printf("%u\n", tint); printf("%d\n", tint); }
結果:
4294967168
4294967168
-128
4294967168
4294967168
-128
-128
4294967168
-128
正確做法:
將 char 轉成unsigned char 做下標