首先卖个关子:

为什么网络编程中的字符定义一般都为无符号的字符?
 
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. python 3 封装

    python 3 封装 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小鱼,小虾,小王八,一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装=‘隐藏’,这种理解是相当片面的. 先看如何隐藏 在 ...

  2. 第一篇 css导入方式 及选择器

    一 推荐资料 推荐书籍 css Zen Garden 中文(css禅意花园) 二.css样式 1.css样式表特征 继承性  大多数css的样式规则可以被继承 层叠性 1)可以定义 多个样式 2)不冲 ...

  3. Ubuntu dpkg 查询已安装的软件包

    要检查特定的包,比如firefox是否安装了,使用这个命令: dpkg -s firefox 要列出你系统中安装的所有包,输入下面的命令: dpkg --get-selections 你同样可以通过g ...

  4. 好久没更了,确实太忙了--dedecms篇

    最近写了一个地方新闻网站,可以看看:www.qiluhuabao.com.模仿www.bashan.com写的 用的是dedecms,只听过,没用过.终于在上周来了一个必须用到cms的项目,现学现卖, ...

  5. Hive split分割后获取最后一段

    ----------------------------------------- 如果只看解决方法,直接看最后... ---------------------------------------- ...

  6. java原生数据类型和引用类型

    java 中String 是个对象,是引用类型基础类型与引用类型的区别是,基础类型只表示简单的字符或数字,引用类型可以是任何复杂的数据结构基本类型仅表示简单的数据类型,引用类型可以表示复杂的数据类型, ...

  7. 1W字看懂互联网知识经济

    互联网知识经济,发生关键变化的不是知识,而是经济. 今天和大家分享方军老师的新书<付费:互联网知识经济的兴起>.这本书是一个老互联网人看新知识经济,很有意思的视角在于,以互联网的发展为节点 ...

  8. g++能过,c++过不了

    可能原因: 1.在递归的时候,递归函数中忘记加返回return.(详见Wrong Answer,Memory Limit Exceeded) 代码1:错误 g++--------accepted c+ ...

  9. nodejs cluster 学习记录

    最近在使用 egg.js ,这个框架提供多进程管理机制 我们知道 JavaScript 代码是运行在单线程上的,换句话说一个 Node.js 进程只能运行在一个 CPU 上.如何榨干服务器资源,利用上 ...

  10. OPcache

    1.介绍 OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销 2.配置 2.1 opcac ...