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;

猜你喜欢

转载自blog.csdn.net/weixin_46726346/article/details/106011568