找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 288|回复: 5
收起左侧

下面的数据类型运算结果和表达式对吗?

[复制链接]
ID:686513 发表于 2026-2-8 11:00 | 显示全部楼层 |阅读模式
float  A;  unsigned long B, C;   unsigned int D;
//方式1:
if(B > C)    D = (unsigned int)(fabs(A*(B - C)));        
else D = 0;
//方式2:if(B > C)    D = abs(A*(B - C));      
else D = 0;
我想得到的结果是无符号长整型数据 D(即:= 右边的计算结果小数部分舍去,只保留整数)。这两种方式运算有问题吗?结果是一样的吗?


回复

使用道具 举报

ID:1167348 发表于 2026-2-8 15:15 | 显示全部楼层
      运算结果是一样的。方式一是 对乘积求绝对值,结果是无符号整型。
  第二种是对乘积的浮点数求绝对值,然后强制类型转换为无符号整型。



回复

使用道具 举报

ID:844772 发表于 2026-2-10 08:55 | 显示全部楼层
有些问题,方式一可能好一点点,要看数值大小,小的时候可能一样。主要是D你定义的不是长型整数,所以如果方式一,如果数值大,强制类转换时会丧失精度;方式二,在abs传参时就会出问题,因为它接受的就是整数,你传浮点数可能会溢出或丧失精度。在C中可用labs()替换,在51我没用过。
回复

使用道具 举报

ID:686513 发表于 2026-2-11 11:52 | 显示全部楼层
wallywl 发表于 2026-2-8 15:15
运算结果是一样的。方式一是 对乘积求绝对值,结果是无符号整型。
  第二种是对乘积的浮点数求绝对 ...

我想得到的结果是无符号长整型数据 D(即:= 右边的计算结果小数部分舍去,只保留整数)。这样的话方式二应该不会溢出了吧?
回复

使用道具 举报

ID:686513 发表于 2026-2-11 11:53 | 显示全部楼层
glinfei 发表于 2026-2-10 08:55
有些问题,方式一可能好一点点,要看数值大小,小的时候可能一样。主要是D你定义的不是长型整数,所以如果 ...

我想得到的结果是无符号长整型数据 D(即:= 右边的计算结果小数部分舍去,只保留整数)。这样的话方式二应该不会溢出了吧?
回复

使用道具 举报

ID:844772 发表于 2026-2-13 10:35 | 显示全部楼层
zhth1979 发表于 2026-2-11 11:53
我想得到的结果是无符号长整型数据 D(即:= 右边的计算结果小数部分舍去,只保留整数)。这样的话方式二应 ...

abs()接受 int,你是long,要看啥系统和编译器了,标准的会溢出。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表