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

声明
本博文源自: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 类型,为了以防万一,最好统一比较的类型,其预期答案才会最符合人的思维,否则出现了隐士转换,防不胜防。

  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值