环境:32位
遇到一个问题,就是在比较 -1和1U的时候,-1>1U。
特别是遇到的signed或者unsigned的时候,就更显得有点晕。
于是有了下面的小结,如果有问题的话希望大家能够指出,谢谢。
[K&R]中有这么一句话“在有符号值与无符号值之间的比较运算中,与机器相关,结果取决于机器中不同数据类型的大小”,看完之后有点不明白,于是,把书中的例子运行了一下,发现的确返回一个“比较大的正数”。但书中没有说具体的算法和原因。
其实应该是这样的:
当有符号值和无符号值之间进行比较时,需要进行类型转换,但从谁向谁转换呢?答案是有符号值向无符号值转换。
C语言中,是根据最大值来决定类型,即两个数值比较时,如果需要进行类型转换,转换方向为向类型所能表示数值范围大的。
例如,如果超出int型所能表示的范围,则用比int型大的最小类型来表示(unsigned int, long 或者unsigned long)。
这样,如果int与unsigned int进行比较,需要将int类型转换为unsigned int类型。
例如:
int t1 = -1;
int t2 = 1U;
t1在计算机中用补码表示为0xffffffff,转换为unsigned int类型为oxffffffff,十进制为4294967295,因此比1U要大。
各种整型范围的比较:
char(signed char)<unsigned char<short int(signed short int)<unsigned short int<int(signed int)<unsigned int<long int(signed int)<unsigned long int