有符号整数除以无符号整数会发生什么??!!!

今天遇到一个问题,先还原一下场景:开始时,使用32位有符号数作被除数,16位无符号数做除数,计算结果正确;然而,将除数换为32位无符号数则出现异常。代码如下

#include <stdint.h>
#include <stdio.h>
int main(void){
  int32_t a=-0x1000;
  uint16_t b=0x50;
  uint32_t c=0x50;
  float result;
  result = a / b;
  printf("a / b = %f\r\n", result);
  result = a / c;
  printf("a / c = %f\r\n", result);
  
  return 0;
}
运行结果:

a / b = -51.000000
a / c = 53687040.000000

为什么同样数值为0x50的除数,类型为uint16除得得结果正确,而类型为uint32除得的结果则异常呢?

现象看起来也许很奇怪,不过仔细一想就会明白为什么了。


首先观察变量a和变量b,变量a是长度为32位的带符号整数,b是长度为16位的无符号整数。C语言规定,不同类型变量进行运算,小数值的数会自动隐式转换为大数值类型,这里的a / b的运算当中,由于b的类型小于a的类型,所以,b被隐式转换为与a想同的类型,并进行运算,运算时相当于执行(-0x1000 / 0x50)。

接下来对比变量a和变量c,变量a是长度为32位的带符号整数,b是长度为32位的无符号整数。这里由于变量a与变量b长度想同但符号不同,C语言规定,带符号数与不带符号数向运算,带符号数将优先转成不带符号数,所以,变量a将被转换成无符号数,运算时相当于执行(0xFFFFF000 / 0x50);


最后总结一下:

在指定算数运算操作时,一定要避免使用不同类型的数直接运算,如果情景特殊要求必须使用不同类型运算,则赢显示类型转换后在运算。避免出现意料之外的运算结果。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值