unsigned类型引起的bug你能发现吗

记录学习的,第十一天?
已经第二个十天了,恩,流弊;
进图主题
在这里插入图片描述
今天在看书时,书上有一个比较有趣的bug,拿来分享一下;

int a[10];
unsigned int x=sizeof(a);
int y=-1;

if(x>y){
    printf("%d",x);
}
else{
    printf("%d",y);
}

很简单的一串代码;恩…输出会是神马呢?
是40?还是-1。
哎?等会,要不要说一下为什么x是40.
在这里插入图片描述
说一下吧,sizeof函数返回值是unsigned类型的整形;
sizeof(a)就应该等于10乘4=40;因为一个int型占4个字节,总共10个int;

好,我们回到这道题,输出的是什么呢;
我觉得,应该是四十!
在这里插入图片描述
所以我错了,答案是-1;
哎?这道题明显的意思是要输出40啊
怎么输出-1呢;
现在我们就来解释一下;
在这里插入图片描述
我们知道如果两个不同类型之间的变量做运算;
会存在C语言中的隐试类型转换;
而unsigned int 和int之间的运算,int类型会转换成unsigned int;
附上一张转换规则图
在这里插入图片描述
现在是不是有点明白了;
如果还不懂,我们继续;
看这段代码:

if(x>y){
    printf("%d",x);
}
else{
    printf("%d",y);
}

显然,x是unsigned int 类型的40;
而y是int 型的-1;
两者之间的比较,y会被强转成unsigned int 类型的变量;
那-1如果变成unsigned int 型的话会是多少呢;
在这里插入图片描述
是不是超级大,所以在这里,我们比较x和y的值;
不是比的40和-1;
而是40和4294967295;
所以应该执行的是else语句
在这里插入图片描述
是不是很有意思;
所以为了以后尽量不出现这种bug;
我们就少用unsigned类型的变量;
因为这种bug实在是不好找,当然也是我自己的看法;

ok,今天的分享就这样;
end;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值