首先卖个关子:

为什么网络编程中的字符定义一般都为无符号的字符?
 
char buf[16] = {0};
unsigned char ubuf[16] = { 0 };
 
上面两个定义的区别是:
buf 是有符号类型的字符
ubuf 是五符号的字符
 

示例:

int main ( int argc, char *argv[] )
{
unsigned char str[] = {0xde, 0xad, 0x2b, 0x6f};
char buf[16] = {0};
unsigned char ubuf[16] = { 0 };
 
//打印无符号的字符
memcpy (buf, str, 4);
printf ("0buf is:0x%x\n", buf[0]);
printf ("1buf is:0x%x\n", buf[1]);
printf ("2buf is:0x%x\n", buf[2]);
printf ("3buf is:0x%x\n", buf[3]);
 
//打印有符号的字符
memcpy (ubuf, str, 4);
printf ("0ubuf is:0x%x\n", ubuf[0]);
printf ("1ubuf is:0x%x\n", ubuf[1]);
printf ("2ubuf is:0x%x\n", ubuf[2]);
printf ("3ubuf is:0x%x\n", ubuf[3]);
 
return 0;
}
 
打印结果:
0buf is:0xffffffde
1buf is:0xffffffad
2buf is:0x2b
3buf is:0x6f
0ubuf is:0xde
1ubuf is:0xad
2ubuf is:0x2b
3ubuf is:0x6f
 

说明

上面的结果反映了一个情况是 :str 的前两个字符,在有符号和无符号打印的时候是不同的
为什么不同?
因为前两个字符的二进制最高位是 1
其他的字符在有符号和无符号时结果不影响,是二进制的最高位是0
 

注意点:

这个会有一个潜在的陷阱问题,就是做字符比较的时候
接着上面的例子:
有符号时
0xde == buf[0] =》 不成立
0xad == buf[1] =》 不成立
0x2b == buf[2] =》 成立
0x6f == buf[3] =》 成立
 
无符号时
0xde == ubuf[0] =》 成立
0xad == ubuf[1] =》 成立
0x2b == ubuf[2] =》 成立
0x6f == ubuf[3] =》 成立
 

总结

1. 在一般做字符操作的时候,需要区分无符号和有符号的情况。
2. 为了避免错误,程序中如果存在字符比较的时候,必须定义为无符号字符
3. 网络编程中的字符定义一般都为无符号的字符,这个是因为存在大量的字符比较
 
 
 
 

最新文章

  1. ORACLE存储过程调用Web Service
  2. xmpp整理笔记:环境的快速配置(附安装包)
  3. asp.net mvc ClaimsIdentity 授权研究 (还是测试版 有bug)
  4. maven 创建Hadoop程序
  5. flex使用buttonbar为viewstack添加导航功能
  6. linux同步
  7. 20160408javaweb之JDBC 大二进制和大文件存取
  8. asp.net -mvc框架复习(11)-基于三层架构与MVC实现完整的用户登录
  9. centOS7下Spark安装配置
  10. Translate Angular >=4 with ngx-translate and multiple modules
  11. VIM vim/vi的文件内、跨文件复制粘贴操作、替换操作
  12. ubuntu 更改hostname, hosts后没有办法执行sudo 问题
  13. djkstra nlogn
  14. 打印函数 lodop
  15. [NOI.AC]COUNT(数学)
  16. windows多线程(三) 原子操作
  17. D. Easy Problem(简单DP)
  18. iptables NAT规则【转】
  19. mssql占用80端口解决办法
  20. HBase 1.3(NOSQL) 发布,性能大幅提升

热门文章

  1. 【leetcode刷题笔记】Binary Tree Preorder Traversal
  2. JavaScript在执行代码之前会校验代码,声明变量提前至当前作用域最前面。
  3. POJ1182 食物链 并查集
  4. docker网络模型
  5. Web container==Servlet container
  6. 测试CPU核心个数
  7. mysql 使用过程中出现问题
  8. php函数decbin
  9. bzoj 4773: 负环 floyd
  10. XMPP群聊消息重复,自己收到自己发出的消息,群警告消息如何屏蔽