首先卖个关子:

为什么网络编程中的字符定义一般都为无符号的字符?
 
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. 【leetcode刷题笔记】Implement strStr()

    Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if need ...

  2. python 3 递归调用与二分法

    递归调用与二分法 1.递归调用 递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身. 示例: def age(n): if n == 1: return 18 # 结束条件 return a ...

  3. render总结

    vue渲染组件的顺序是: 执行render函数-->没有render参数解析template参数内容-->没有template参数将el内html当做template解析 其中解析temp ...

  4. BestCoder Round #4 之 Miaomiao's Geometry(2014/8/10)

    最后收到邮件说注意小数的问题!此代码并没有过所有数据,请读者参考算法, 自己再去修改一下吧!注意小数问题! Miaomiao's Geometry Time Limit: 2000/1000 MS ( ...

  5. 机器学习——支持向量机(SVM)

    机器学习--支持向量机(SVM) 支持向量机(Support Vector Machine)广泛地应用于分类问题,回归问题和异常检测问题.支持向量机一个很好的性质是其与凸优化问题相对应,局部最优解就是 ...

  6. 分享知识-快乐自己:IO流基本操作

    点我参考常用API: IO图解: 相关理论: 流的概念和作用: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将 ...

  7. 分享知识-快乐自己:SSH 整合 Demo

    楼主A: XML 版 SSH整合Demo https://github.com/MlqBeginner/BlogGardenWarehouse/blob/master/SSH%E6%95%B4%E5% ...

  8. Unity3D之Mesh(五)绘制圆

    前言: Unity3D中Mesh的基本单位是三角形,而圆形就是由许许多多的三角形组成的.那么我们就知道了绘制圆形的Mesh需要两个变量:圆的半径  以及分割数: 一.实现过程 基本过程与之前的类似,最 ...

  9. appium界面元素介绍

    一.主窗口 主页面顶部从左到右依次是: AndroidSettings:android相关的设置 GeneralSettings:全局设置,设置appium相关的内容 DeveloperSetting ...

  10. Python基础-redis模块使用

    redis是一个数据库,他的数据全都是存放在内存里面的,redis每秒能支持30w次的读写,存放有两种格式,一种string类型,一种是hash类型 一,操作string类型 r=redis.Redi ...