1. 程式人生 > >避免用char型別作為陣列小標

避免用char型別作為陣列小標

在統計字串的時候常用陣列來統計,字元為陣列下標,如求字串中第一個不重複(只出現過一次)的字元

但是字元的型別是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 做下標