• 关于 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. 网络编程中的字符定义一般都为无符号的字符,这个是因为存在大量的字符比较
     
     
     
     
  • 相关阅读:
    [计算机网络-传输层] 无连接传输:UDP
    [BinaryTree] 最大堆的类实现
    [OS] 生产者-消费者问题(有限缓冲问题)
    [剑指Offer] 64.滑动窗口的最大值
    [剑指Offer] 63.数据流中的中位数
    [剑指Offer] 62.二叉搜索树的第k个结点
    [OS] CPU调度
    [剑指Offer] 60.把二叉树打印成多行
    MySQL数据库实验二:单表查询
    数据库实验:基本表的定义与修改
  • 原文地址:https://www.cnblogs.com/etangyushan/p/6871701.html
Copyright © 2020-2023  润新知