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

来源:互联网 发布:散爆网络 编辑:程序博客网 时间:2024/05/23 21:20

字符类型有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。

0 0
原创粉丝点击