unsigned char 和signed char的选择问题

本文探讨了在处理字符串时,如何灵活地使用char和unsigned char类型。特别是在需要同时处理字符和无符号数值的情况下,提出了一种简化的方法来避免类型转换带来的麻烦。
这个问题似乎很简单,要表示8位无符号数值的时候,用unsigned char,要表示8位有符号数值或者ASCII字符的时候,用char。
但是,有的时候会遇到这样一种情况,从一串字符串中取出的字符,既有当字符使用的,也有当无符号8位数值使用的,这下就有点小纠结了,特别在定义接收字符串参数的函数时,参数该定义为unsigned char 类型的呢,还是定义成char类型的呢?
一种方法是按需要决定,如果函数里把它当无符号数值使用,就定义成unsigned char的参数,但是,这样还得把字符串当中用作无符号数值的部分,用另一个unsigned char数组存放起来,再传递给函数。否则会出现编译不通过的情况。
假设有:
view plain
char buf[N];  
要把其中当无符号数值使用的部分传给如下函数。
view plain
void process(unsigned char *puc, size_t sz)  
  
{  
     ...  
}  


如果直接这样:


view plain
process(buf+userN, size)  
在GUN编译器下,会提示不能将参数char*类型转换在unsigned char*类型,因此我们还要开辟一个临时的unsigned char数组才行。如下:


view plain
unsigned char ucBuf[N] = {0};  
memcpy(ucBuf, buf+userN, size);  


然后将unsigned char数组传递给函数:


view plain
proccess(ucBuf, size)  
这样的话,每一个使用这个函数的地方,都要做这个麻烦的步聚。


后来想了想,觉得将所有函数的接口都定义成接收char *类型的字符串,这样就不必考虑类型不匹配的问题了,然后在要直接计算的地方将char 类型做相应的转换。


view plain
void proccess(char *buf, size_t sz)  
  
{  
     unsigned char ucBuf[N] = {0};  
     memcpy( ucBuf, buf, sz );  
     ...  
}  


这样使用函数的地方就不必考虑这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值