signed 与 unsigned 比较大小的默认转换

C99标准:如果int能够表示原始类型中的所有数值,那么这个数值就被转成int型,否则,它被转成unsigned int型。这种规则被称为整型提升。所有其它类型都不会被整型提升改变。

 

学习c语言的朋友们也许都学到了int型与unsigned int型比较大小的方法。比如以下程序:

#include <stdio.h>

int main()

{

    int a = -1;

    unsigned int b = 1;

    if(a > b){

        printf("a = %d\n",a);

    } else {

        printf("b = %d\n",b);

    }

 

    return 0;
}

 

输出结果是: a = -1

 

    原因在于int 型与unsigned int 型在自己没有进行强制转换的情况下进行比较。int类型在linux下默认强制转换为signed int类型进行比较,所以a与b比较的时候,a会自动转换成unsigned int类型进行比较。由于signed int的符号位最高位是1,转换成unsigned int之后,就会变成一个很大的unsigned int型正数,所以a与b比较时a会大于b。所以会输出a = -1;

 

    而在遇到char 与 unsigned char 进行比较的时候,情况就不一样了。如一下程序:

 

#include <stdio.h>

int main()

{

    char a = -1;

    unsigned char b = 1;

    if(a > b){

        printf("a = %x\n",a);

    } else {

        printf("b = %x\n",b);

    }

 

    return 0; 

}

 

输出结果为: b = 1

 

    原因在于char类型在linux下比较。首先表达式中小于int的类型会全部强制转换为int,在进行比较。signed char类型提升为int后,符号位就变成了数值位,于是负的signed char就变成了较大的数值。a变成较大的值,b转换成int也还是1,所以a与b比较时a会小于b。所以会输出b = 1。可以查阅整值提升相关资料。

这里要感谢@丹心在夏指出的问题。现已修改。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值