有符号数与无符号数混合运算

有符号数与无符号数混合运算时,把有符号数转化为无符号数,再合并运算,得到的结果是无符号数。
tips: 同一数字的无符号表示与补码表示相加的结果为2^n,其中n是这个数字的位数。

注意,下面这段代码并不是(-100+1)再转换成无符号数,而是把-100看成无符号数后再与1相加。

#include <stdio.h>
#include <math.h>
int main()
{
    int x=-100;
    unsigned y=1;
    printf("x+y=%d(有符号)\n",x+y);
    printf("x+y=%u(无符号)",x+y);
    return 0;
}

结果如下
在这里插入图片描述
这个例子中我们也发现,printf函数可以根据输出格式控制符的不同来决定输出的是有符号数还是无符号数。

下面这段代码体现了有符号数与无符号数相加时产生溢出的情况。

#include <stdio.h>
#include <math.h>
int main()
{
    int x=-1;
    unsigned y=16;
    printf("x+y=%d(有符号)\n",x+y);
    printf("x+y=%u(无符号)",x+y);
    return 0;
}

-1=0xFFFFFFFF(此时看作是无符号数)
0xFFFFFFFF+16向上溢出,结果为15(而不是一个绝对值很大的负数!)
在这里插入图片描述
下面这段代码说明,如果是char等比int小的类型,运算时都会转换成int运算。特别地,char为符号扩展,unsigned char为逻辑扩展。

#include <stdio.h>
#include <math.h>
int main()
{
    char x=-2;
    unsigned char y=-1;
    printf("x+y=%d(有符号)\n",x+y);
    printf("x+y=%u(无符号)",x+y);
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值