无符号数与有符号数比较大小

声明
本博文源自:http://blog.csdn.net/qiuchangyong/article/details/7495008
在此感谢博主!


先出几个题目,再解释一下为什么答案是那样的。

题目一:

int a = -1;
unsigned int b = 1;
printf("%d", a > b);

结果输出: 1

因为无符号数与有符号数比较时,要将有符号数转化为无符号数,再来比较。a 转化为无符号数后就是 0xFFFFFFFF,肯定大于 b

题目二:

char a = -1;
unsigned char b = 1;
printf("%d", a > b);

结果输出: 0

奇怪了,怎么会这样?这是因为两者被转化为 int 了, a 转化为 int 就表示 -1,b 转化为 int 就是 1,前者小于后者。注意了这里不是像“题目一”里一样简单的把 char 转化为 unsigned char 了

题目三:

int a = -1;
unsigned char b = -1;
printf("%d\n", a < b);

结果输出是: 1

原因在于要把 b 转化为 int 就是 0xFF 当然大于 -1 了

题目四:

char a = -1;
unsigned int b = -1;
printf("%d\n", a == b);

结果输出: 1

原因是 char 类型被扩展为 unsigned int 后与 b 相等,同为 0xFFFFFFFF


下面给出我个人得出的一些结论:

  • 无符号 int 与有符号 int 比较大小,转化为无符号 int 来比较
  • int 类型与非无符号 int 的类型比较时,非无符号 int 的类型转化为 int 来比较
  • 无符号 int 类型与其他类型如 unsigned short,signed short,unsigned char, char 比较时,其他类型一律转化为无符号 int 类型来比较
  • 非无符号 int 类型和非 int 类型如 unsigned short,signed short,unsigned char, char 比较时,一律转化为 int 类型来比较

博主添加部分:
以上 “非无符号 int ”的准确理解为 “非 无符号 int”, 即“非”指代的是 int 。举例: unsigned short、char 等等都是非无符号 int 类型

总之,无符号与有符号类型比较大小时,存在很大陷阱,为了不陷入,比较之前统一类型是明智之举。

比如:

unsigned short u16a = 16;
short i16b = -1;
printf("%d\n", u16a > i16b);

结果输出: 1

可修改成如下:

unsigned short u16a = 16;
short i16b = -1;
short i16Tmp = u16a; //在不越界的前提下,把无符号转换成有符号类型,再进行比较
printf("%d\n", i16Tmp > i16b);

虽然不修改也是正确的。根据结论的第四条来判断的话,那是因为没有涉及到 int 类型,为了以防万一,最好统一比较的类型,其预期答案才会最符合人的思维,否则出现了隐士转换,防不胜防。

你可能感兴趣的:(编程基础,无符号与有符号数比较)