打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
该使用char还是unsigned char
userphoto

2018.10.02

关注

这个问题似乎很简单,要表示8位无符号数值的时候,用unsigned char,要表示8位有符号数值或者ASCII字符的时候,用char。

但是,有的时候会遇到这样一种情况,从一串字符串中取出的字符,既有当字符使用的,也有当无符号8位数值使用的,这下就有点小纠结了,特别在定义接收字符串参数的函数时,参数该定义为unsigned char 类型的呢,还是定义成char类型的呢?

一种方法是按需要决定,如果函数里把它当无符号数值使用,就定义成unsigned char的参数,但是,这样还得把字符串当中用作无符号数值的部分,用另一个unsigned char数组存放起来,再传递给函数。否则会出现编译不通过的情况。

假设有:

char buf[N];


要把其中当无符号数值使用的部分传给如下函数。

  1. void process(unsigned char *puc, size_t sz)

  2. {
  3. ...
  4. }


如果直接这样:

process(buf+userN, size)

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

  1. unsigned char ucBuf[N] = {0};
  2. memcpy(ucBuf, buf+userN, size);


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

proccess(ucBuf, size)

这样的话,每一个使用这个函数的地方,都要做这个麻烦的步聚。

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

  1. void proccess(char *buf, size_t sz)

  2. {
  3. unsigned char ucBuf[N] = {0};
  4. memcpy( ucBuf, buf, sz );
  5. ...
  6. }


这样使用函数的地方就不必考虑这些问题。

只是做个经验总结,如果谁有更好方法,留言交流下哈。



 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
golang cgo 使用总结
C语言的一些“骚操作”及其深层理解
018.任意进制数的转换
编程命名中的7 1个提示 | 酷壳
VC数据类型
ip地址与整数之间的转换
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服