blog:programming:c_unsigned_and_signed

C语言无符号数与有符号数的比较

在算术运算和关系运算中如果参与运算的操作数类型不同,编译系统会自动对数据类型进行转换(隐式转换)

赋值表达式中,右边表达式的值隐式转换为左边变量的类型,并赋值给左边. 函数调用时,隐式将实参转换为形参的类型后,再赋值为形参.

算术运算的的隐式转换规则

  1. 字符型(char)必须先转换为整型(int), (字符类型数据和整型数据之间可以通用)
  2. short型转换为int型
  3. float型数据在运算时一律转换为double型,以提高运算精度(两者同属于实型)

其次,遵循如下规则: 当不同类型的数据进行运算时,应将其转换为相同的数据类型,然后进行操作,转换规则:由低类型转换为高类型数据

                                          float
                                            |
                                            v
char, short -> int -> unsigned -> long -> double

低类型 --------------------------------->  高类型

例1

    int a = -1;
    unsigned int b = 1;

    if (a > b) {
        printf("-1(int) > 1(unsigned int)\n");
    } else {
        printf("-1(int) < 1(unsigned int)\n");
    }
    
    执行结果: -1(int) > 1(unsigned int)

原因: 无符号数与有符号数进行比较时,需要将有符号数转换为无符号数后再比较。a转换为无符号数后是0xFFFFFFFF, 肯定大于b

例2

    char a = -1;
    unsigned char b = 1;

    if (a > b) {
        printf("-1(char) > 1(unsigned char)\n");
    } else {
        printf("-1(char) < 1(unsigned char)\n");
    }
    
    执行结果: -1(char) < 1(unsigned char)

原因: 因为a和b都被转换为int型了, 所以a < b

    而不是和例1一样,将char转换为unsigned char

例3:

    char a = -1;
    unsigned char b = -1;

    printf("-1(char): 0x%x\n", a);
    printf("-1(unsigned char): 0x%x\n", b);
    
    执行结果: 
            -1(char): 0xffffffff
            -1(unsigned char): 0xff
  • blog/programming/c_unsigned_and_signed.txt
  • 最后更改: 2022/01/09 22:40
  • 127.0.0.1