首先卖个关子:

为什么网络编程中的字符定义一般都为无符号的字符?
 
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. 网络编程中的字符定义一般都为无符号的字符,这个是因为存在大量的字符比较
 
 
 
 

关于 char 和 unsigned char 的区别的更多相关文章

  1. char 与 unsigned char的本质区别

    在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别 首先在内存中,char与unsigned char没有什么不同 ...

  2. C 中 char、signed char 和 unsigned char 的区别

    C 中 char.signed char 和 unsigned char 的区别 来源:http://bbs.chinaunix.net/thread-889260-1-1.html 参考:https ...

  3. c语言中 char* 和 unsigned char* 的区别浅析(转)

    原文:https://blog.csdn.net/guotianqing/article/details/77341657 背景最近在项目中遇到了一个编译警告,是因为定义的变量为char[],而在使用 ...

  4. char、signed char、unsigned char的区别总结。

    转载地址:http://hi.baidu.com/thewillreigns/blog/item/67e665c4296e69c038db492d.html char 和 unsigned char是 ...

  5. char、signed char 和 unsigned char 的区别

    ANSI C 提供了3种字符类型,分别是char.signed char.unsigned char.而不是像short.int一样只有两种(int默认就是signed int). 三者都占1个字节( ...

  6. char 与 unsigned char的区别和取值范围

    1.char和unsigned char 都是一个byte,8个bit.char是无符号类型,首位bit是符号位. 2.取值范围不同: (1)unsigned char的取值范围:0~2^8-1(0~ ...

  7. char, signed char, and unsigned char in C++

    关于这三者的区别stackoverrflow里有一个答案是这样说的: 3.9.1 Fundamental types [basic.fundamental] 1 Objects declared as ...

  8. char与unsigned char 差别

    char 与 unsigned char的本质差别 http://bbs.csdn.net/topics/270080484 同一个内存内容:10010000      你用char*   解释是-1 ...

  9. signed char、unsigned char

    什么是无符号char类型?与常见的char类型有何不同? 在c++中有三种不同的字符类型:char,signed char,unsigned char.如果要应用与文本字符,就使用不加限制的char类 ...

随机推荐

  1. 剑指offer——翻转单词顺序VS左旋转字符串

    字符串的交换等,注意判断字符串的是否为NULL,以及判断边界等. #include <iostream> #include <string> using namespace s ...

  2. nginx gzip 压缩设置

    mime.types 中包含所有文件的类型,不知道的可以去里面查询 gzip配置的常用参数 gzip on|off;  #是否开启gzip gzip_buffers 32 4K| 16 8K #缓冲( ...

  3. 算法(Algorithms)第4版 练习 2.1.24

    代码实现: package com.qiusongde; import edu.princeton.cs.algs4.In; import edu.princeton.cs.algs4.StdOut; ...

  4. 用用OGRE1.74搭建游戏框架(转载)

    用OGRE1.74搭建游戏框架(一) 新版的OGRE出来了,不知什么原因抛弃了CEGUI.国内的教程好像也更新比较少了,在官网上还是发现不少资料的,现在参考官网上的一些资料来搭建一个游戏的框架. 参考 ...

  5. Oracle备份和恢复

    --什么是脱机备份 脱机备份也叫冷备份,首先管理员使用 shutdown immediate 命令关闭数据库的服务. 之后复制需要的文件,包括数据文件和控制文件等相关内容复制到磁盘的其他位置.当 数据 ...

  6. matlat之KDTreeSearcher()函数

    Create Kd-tree nearest neighbor searcher(创建kd-树最近邻搜索器). Description KDTreeSearcher model objects sto ...

  7. jQuery ztree 自制一套 灰蓝皮肤

    jQuery ztree 自制一套 灰蓝皮肤 PNG图片替换官方ztree下img文件中的png图片即可

  8. MyEclipse消除frame引起的the file xxx cannot be found

    因为该页面所指向的页面路径不对,便进行手动修改,修改时却出现了很烦的问题,输入一个字就弹出一个提示框“the file XXX can not be found.Please check the lo ...

  9. 封装一个简单的Hibernate SessionFactory

    封装Hibernate框架中的session工厂   ,方便很多,免去了很多重复无用的代码 package com.maya.test; import org.hibernate.*; import ...

  10. 基于v4l2 ffmpeg x264的视频远程监控(附上编译好的库文件)

    说明:主要是基于ghostyu网友整理的< arm mini2440 基于v4l2 ffmpeg x264的视频远程监控>.自己做了一遍,遇到不少问题,就整理记录下来. 1.平台 硬件:a ...