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. 网络编程中的字符定义一般都为无符号的字符,这个是因为存在大量的字符比较
     
     
     
     
  • 相关阅读:
    4种方法教你如何截取JS字符串最后一位
    12种JS常用获取时间的方式
    拖动的模态框
    计算鼠标在盒子内的坐标
    offset与style的区别
    offset系列属性
    Words
    #一些真相# 和自己握手言和,不要期盼另一片荒岛可以让你变成陆地
    Stack为什么翻译成栈?- 根据字形来辨别容易混淆的堆和栈
    [Hardware] 机械硬盘和固态硬盘功耗对比
  • 原文地址:https://www.cnblogs.com/etangyushan/p/6871701.html
Copyright © 2011-2022 走看看