char与unsigned char的综合比较及实例

来源:互联网 发布:ce改车软件 编辑:程序博客网 时间:2024/05/12 19:16


字符类型有char与unsigned char两种,它们之间有何区别呢?为何对字符也要分个有符号与无符号呢?下面是个人的见解。

char 是有符号的 ,unsigned char 是无符号的。

char 整数范围为-128到127( 0x80__0x7F), 而unsigned char 整数范围为0到255( 0__0xFF )。

其实分出个正负是由于char类型在内存中的存储形式与int类型相同(或说相似),也正是由于此点char类型的值可以与int类型(包括unsigned,short等)的值通用。当然要注意表示的范围。

char可以看成是单字节的整数,而int类型最低也得要两个字节(本处说int时代指了所有的整型类型)。当要用单字节表示整数时(以节省内存)就得用char。

更为重要的是英文字母ASCII中都小于0x80,0x80以上的字符都是非英文字符及制表符(当然包括汉字及其他国家的字符)。而对于char来说最大只能表示到0x7F(127),要想表示非英文字符就要大于0x7F,因而也也必须要产生一个unsigned char(它的范围大于0X7F)。

请看以下的简单示例:

#include <stdio.h>

#include <string.h>

void main()

{

int nCount=0;

//char*p="abcd汉字";

char p[]="abcd汉字";

int len=strlen(p);

int num=0;

for(int i=0;i<len;i++)

{

   if((unsigned char)p[i]>0x7F)

   {

    i++;

    num++;

   }

   nCount++;

}

printf("字符串 \"%s\" 长度为 %d 字节,共有 %d 个字符,其中汉字字符有 %d 个。\n",p,len,nCount,num);

//另外一种方法:

/*char*/ unsigned char *szText= (unsigned char*)"12345你好"; 

int len2= strlen((const char*)szText); //强制转换

int sum=0; 

for (int j=0; j< len2; j++) 


   if (/*(unsigned char)*/szText[j] > 0xa0) 

    sum++;

   sum/=2; 

   printf("字符串 \"%s\" 中有汉字 %d 个。\n",szText,sum);

}

注意:代码中若要把字符数组直接定义为unsigned char,用strlen函数时要注意强制类型转换,否则出错。此时可以注释掉if语句中的unsigned char。若要定义数组为char,可以直接用strlen函数,但在if语句中需要加上unsigned char。