0%

char和指针的问题

char和指针的问题一直是我学了又忘的东西,故写下这篇博客做一个备忘录.

1.char和unsigned char之间的区别

unsigned char 是无符号字节型,char类型变量的大小通常为1个字节(1个字节=8个位),且属于整型。

相同点:在内存中都是一个字节,8位(2^8=256),都能表示256个数字
不同点:char的最高位为符号位,因此char能表示的数据范围是-128 ~ 127,unsigned char没有符号位,因此能表示的数据范围是 0 ~ 255

但是要把一个char类型的变量赋值给int、long等数据类型或进行类似的强制类型转换时时,系统会进行类型扩展,这时区别就大了。

对于char类型的变量,系统会认为最高位为符号位,然后对最高位进行扩展,即符号扩展:若最高位为1,则扩展到int时高位都以1填充。对于unsigned char类型的变量,系统会直接进行无符号扩展,即0扩展。扩展的高位都以0填充。

所以在进行类似的操作时,如果char和unsigned char最高位都是0,则结果是一样的;若char最高位为1,则结果会大相径庭。

2. unsigned char* 的用法

char *是字符串,以’/0’为结束符,unsigned char *是普通的指针;

1
2
3
4
5
6
7
8
9
unsigned char *p;
p = (unsigned char *)ZiFuKuTable;

const unsigned char *ZiFuKuTable =
{
"0123456789"\
"TRHVI%:,mABCDEF.bat-"\
" "\
};

p = (unsigned char *)ZiFuKuTable;是指将ZiFuKuTable的地址值强制性转换为无符号字节类型;

*p是对该地址进行取值操作。

两种颜色的功德箱(逃