为啥-1大于1,-1乘3却不等于-3?直到了解C语言自动转换原则后...

本文通过C语言中-1大于1的实例,探讨了C语言自动转换原则,即无符号数与有符号数运算时,有符号数会被转换为无符号数。这一原则在函数调用、赋值表达式和算术运算中都有体现。文章还分析了-1乘以3得到4294967293而非12884901885的原因,涉及到无符号数溢出的问题。最后,鼓励读者深入学习并提供了编程学习资源。
摘要由CSDN通过智能技术生成

今天我们由C语言的一个经典题目入手,跟大家聊聊C语言一个非常重要的规则,不要着急,让我们从-1大于1的例子说起。

unsigned int i=1;

signed int j=-1;

很简单,无符号数i,有符号数j,比较i和j的大小,按照常理i是大于j的,但是实验证明j>i,也就是说-1>1,为什么会这样呢?

其实出现这个情况的原因就是C语言中的自动转换原则,这也是今天我们想给大家说的话题。在C语言中,若遇到无符号数和有符号数之间的操作,这时候会出现数据类型的提升现象,编译器会自动把有符号数转化为无符号数来进行处理,因此i是1没错,但j却不是-1了,而是变成了 4294967295。所以j>i了。

 

关于数据为何是4294967295,我们今天从数学的角度给大家分析一下,供大家参考。

首先大家知道无符号数unsigned int的表示范围是:[0 4294967295 ]= [0 2147483647] U [2147483648 4294967295],数学上称为值域。而有符号数int的值域是 [-2147483648—2147483647]。两个区间的元素个数都是4294967296个。

由此看出,二者的公共域是[0 2147483647]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值