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