C语言无符号数与有符号数的比较
在算术运算和关系运算中如果参与运算的操作数类型不同,编译系统会自动对数据类型进行转换(隐式转换)
赋值表达式中,右边表达式的值隐式转换为左边变量的类型,并赋值给左边. 函数调用时,隐式将实参转换为形参的类型后,再赋值为形参.
算术运算的的隐式转换规则
- 字符型(char)必须先转换为整型(int), (字符类型数据和整型数据之间可以通用)
- short型转换为int型
- 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