• C语言补漏(1) char到int赋值的一个陷阱


    作为一个C的新手(虽然学的第一门语言就是C,可是用C实际开发项目却是最近的事情),对使用C过程中遇到的各类问题、疑惑、知识漏洞进行弥补无疑是非常有必要的,于是决定将每次遇到的知识漏洞写到博客上。

    今天在写代码的过程中对一个函数进行了重构,函数的用处是将一块内存中的内容打印成16进制表示的字符串;很悲哀的输入的是一个char指针:char* buffer;当调用Format("%02X",*buffer)的时候出现问题了,

    比如:0xB0输出变成了:“FFFFFFB0”;最后发现是char惹得祸;

    char取为unsigned char还是signed char是平台相关的,而我的平台中,char默认为有符号的,那么(signed)char和unsigned char究竟有什么区别呢?

    char带符号能表示-128~127, unsigned char没有符号位,能表示0~255;而本质上都是表示8位的数字。

    但是我们如果要表示byte时(C本身没有byte类型),应该用unsigned char,这是为什么呢?

    因为当用char对int进行赋值时,系统认为最高位是符号位,而int可能是16或者32位,那么会对最高位进行扩展(注意,赋给unsigned int也会扩展)

    而如果是unsigned char,那么不会扩展。

    这就是二者的最大区别。

    同理可以推导到其它的类型,比如short, unsigned short。等等

    还是用例子来说明问题吧:

    #include "stdafx.h"
    #include <stdio.h>

    void test(unsigned char v)
    {
    char c = v;
    unsigned char uc = v;
    unsigned int a = c, b = uc;
    int i = c, j = uc;
    printf("----------------\n");
    printf("%%c: %c, %c\n", c, uc);
    printf("%%X: %X, %X\n", c, uc);
    printf("%%u: %u, %u\n", a, b);
    printf("%%d: %d, %d\n", i, j);
    }

    int main(int argc, char* argv[])
    {
    test(0xB0);
    test(0x68);
    return 0;
    }

    运行结果:


    所以,如果表示的是byte的情况,建议用unsigned char;当然,如果非要用char也可以;加上& 0xFF也能解决问题吧。

  • 相关阅读:
    Google Authentication 机制原理
    ldap日志
    ldap + kerberos 整合
    kerberos
    U盘格式化后的恢复
    初始化脚本(Os_Init_Optimization.sh)
    拿到新机器,进行初始化和部署Nginx的过程
    python 列表生成式
    python 装饰器
    简单总结无线CPE、无线AP、无线网桥的不同之处【转】
  • 原文地址:https://www.cnblogs.com/xiekeli/p/2345649.html
Copyright © 2020-2023  润新知