关于 char 和 unsigned char 的区别
2024-08-21 06:16:13
首先卖个关子:
为什么网络编程中的字符定义一般都为无符号的字符?
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. 网络编程中的字符定义一般都为无符号的字符,这个是因为存在大量的字符比较
最新文章
- ORACLE存储过程调用Web Service
- xmpp整理笔记:环境的快速配置(附安装包)
- asp.net mvc ClaimsIdentity 授权研究 (还是测试版 有bug)
- maven 创建Hadoop程序
- flex使用buttonbar为viewstack添加导航功能
- linux同步
- 20160408javaweb之JDBC 大二进制和大文件存取
- asp.net -mvc框架复习(11)-基于三层架构与MVC实现完整的用户登录
- centOS7下Spark安装配置
- Translate Angular >;=4 with ngx-translate and multiple modules
- VIM vim/vi的文件内、跨文件复制粘贴操作、替换操作
- ubuntu 更改hostname, hosts后没有办法执行sudo 问题
- djkstra nlogn
- 打印函数 lodop
- [NOI.AC]COUNT(数学)
- windows多线程(三) 原子操作
- D. Easy Problem(简单DP)
- iptables NAT规则【转】
- mssql占用80端口解决办法
- HBase 1.3(NOSQL) 发布,性能大幅提升