zoukankan      html  css  js  c++  java
  • 关于 char 和 unsigned char 的区别

    首先卖个关子:

    为什么网络编程中的字符定义一般都为无符号的字符?
     
    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 ", buf[0]);
    printf ("1buf is:0x%x ", buf[1]);
    printf ("2buf is:0x%x ", buf[2]);
    printf ("3buf is:0x%x ", buf[3]);
     
    //打印有符号的字符
    memcpy (ubuf, str, 4);
    printf ("0ubuf is:0x%x ", ubuf[0]);
    printf ("1ubuf is:0x%x ", ubuf[1]);
    printf ("2ubuf is:0x%x ", ubuf[2]);
    printf ("3ubuf is:0x%x ", 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. 网络编程中的字符定义一般都为无符号的字符,这个是因为存在大量的字符比较
     
     
     
     
  • 相关阅读:
    捕获Java线程池执行任务抛出的异常
    Java Singleton 单例模式
    深度解析Java内存的原型及工作原理
    使用Spring管理数据源连接池
    Java中用内存映射处理大文件
    基于Java阻塞队列的搜索实例
    Java学习之将图片文件保存到数据库
    Java使用反射调用方法
    Java程序员易犯的10个SQL错误
    Hibernate中的数据库增改删查操作
  • 原文地址:https://www.cnblogs.com/etangyushan/p/6871701.html
Copyright © 2011-2022 走看看