首先卖个关子:

为什么网络编程中的字符定义一般都为无符号的字符?
 
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. codevs1997 守卫者的挑战

    题目描述 Description 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突 然,眼前一道亮光闪过.“我,Nizem,是黑魔法圣殿的守卫者. ...

  2. CSS3制作分步注册表单

    这个DEMO是使用CSS3制作的一个分步注册表单,每个input对应的是每一步,在表单得到焦点时,对应的step也会进行对应的改变.不过这个效果是使用js代码来实现,但整个表单的外观是由CSS3来完成 ...

  3. 分享知识-快乐自己:Maven 无法加载 Oracle 数据库驱动源

    由于Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库. 手动添加到本地仓库需要本地有 ...

  4. JavaWeb_常用功能_01_文件上传

    一个功能完善的JavaWeb应用,必不可少的一个功能就是文件的上传.无论是用户的头像等,还是用户需要上传的一系列资料,都是通过文件的上传功能实现的. 目前我们实现网站中关于文件的上传功能时,常用的是a ...

  5. 【Codeforces Round #466】E. Cashback DP+ST表

    题意 给定$n$个数,将其划分成若干个连续的子序列,求最小价值,数组价值定义为,数组和减去$\lfloor \frac{k}{c} \rfloor$,$k$为数组长度,$c$为给定数 可以列得朴素方程 ...

  6. Metasploit的使用下篇——漏洞攻击

    一.上文总结 上篇当中主要通过开启的端口对目标主机进行攻击,最后成功做到了连接不过却不能查看到telnet的登陆用户名和密码,目前来看有两个原因:第一.我对于靶机telnet的设置有问题,没有设置相应 ...

  7. NOIP 2011 DAY 2

    第一题:计算系数 题目 给定一个多项式 (ax+by)k​​,请求出多项式展开后x​​ny​m​​ 项的系数. 输入 共一行,包含 5 个整数,分别为 a,b,k,n,m,每两个整数之间用一个空格隔开 ...

  8. bzoj 3611: [Heoi2014]大工程 虚树

    题目: 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通道需要的代价为树上 ...

  9. 使用Excel制作万年历(日历可A4纸打印)

    先来看看A4纸打印效果,其他功能后续继续完善中. 年份数据字典(农历节日) 农历节日表 年度 春节 元宵节 龙抬头 端午节 六月六 七月七 七月十五 仲秋节 除夕 2010年02月14日 2010年0 ...

  10. BZOJ3680:吊打XXX

    我对模拟退火的理解:https://www.cnblogs.com/AKMer/p/9580982.html 我对爬山的理解:https://www.cnblogs.com/AKMer/p/95552 ...