搜索
bottom↓
回复: 26

求助 两个unsigned int 相减 (结果负) 不能直接赋值给float ?

[复制链接]

出0入91汤圆

发表于 2023-1-31 16:51:59 | 显示全部楼层 |阅读模式
代码大概是

unsigned int a;
unsigned int b;
double c;
a=15;
b=20;

c=a-b;



然后c就出错了 , 我好像一直是这样写程序的    难道我这样写不规范?

STC 单片机  KEIL 4  


完蛋了  我感觉有点颠覆我认知了

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出1310入193汤圆

发表于 2023-1-31 16:56:15 | 显示全部楼层
if(a>=b)
{
c=(double ) (a-b );
}

是不是严谨一些  求答案

出235入235汤圆

发表于 2023-1-31 16:57:08 | 显示全部楼层
和浮点没有关系,unsigned int 不能存储unsigned int 减去unsigned int

c=(int)a-(int)b;
这样就对了?

或者
c=(int)(a-b);


高手指导一下,貌似表达式运算结果会按左边类型存储。再幅值给C,在赋值之前就错了!和浮点无关。


出0入91汤圆

 楼主| 发表于 2023-1-31 16:59:50 | 显示全部楼层
lyping1987 发表于 2023-1-31 16:57
和浮点没有关系,unsigned int 不能存储unsigned int 减去unsigned int

c=(int)a-(int)b;
(引用自3楼)


我也在怀疑 运算的过程 是按照  左边a的 类型 参与运算      而不是按照   结果C来进行运算的  好奇怪

今天这个问题 卡了我好几天了 今天才把问题定位到点

因为RAM快耗尽了,所以一直在找RAM的问题

出0入91汤圆

 楼主| 发表于 2023-1-31 17:00:59 | 显示全部楼层
lb0857 发表于 2023-1-31 16:56
if(a>=b)
{
c=(double ) (a-b );
(引用自2楼)

我试了下  
c=a;
c=c-b;
也可以

出0入984汤圆

发表于 2023-1-31 17:02:56 | 显示全部楼层
本帖最后由 Himem 于 2023-1-31 17:04 编辑

15-20 == (uint32_t)0xFFFFFFFB ==  4294967291.0

出235入235汤圆

发表于 2023-1-31 17:04:26 | 显示全部楼层
ackyee 发表于 2023-1-31 17:00
我试了下  
c=a;
c=c-b;
(引用自5楼)

是的,C是浮点,c-b会按  float=float-uint
b-a会按 uint=uint-uint来,,得到的结果不是正确的负数,所以再给float的时候,也是徒劳。

出5入14汤圆

发表于 2023-1-31 17:20:40 | 显示全部楼层
c=(float)a-(float)b ;

出0入0汤圆

发表于 2023-1-31 17:44:33 | 显示全部楼层
之前在IAR上也遇到这个坑,网上找了下资料有一个C语言标准文档可以参考,有解析(不记得了,也没有搜索到了)。意思就是负值是不可以直接强制转换为浮点数。所以8楼的写法是OK的。

出0入91汤圆

 楼主| 发表于 2023-2-1 08:45:52 | 显示全部楼层
HalenYU 发表于 2023-1-31 17:44
之前在IAR上也遇到这个坑,网上找了下资料有一个C语言标准文档可以参考,有解析(不记得了,也没有搜索到了 ...
(引用自9楼)

看来这个问题的根本原因还是对C不太熟悉

出0入84汤圆

发表于 2023-2-1 09:24:40 | 显示全部楼层
C语言对无符号和有符号数相减一直是老大难。
尽量避免这种情况,而且不同的编译器版本和IDE可能处理方式也不一样,keil对char 很多默认都解析为unsigned char。
涉及到减法和比较大小的 尽量让变量都定义为有符号数,加上signed。
以前也被坑过

出30入42汤圆

发表于 2023-2-1 10:09:57 | 显示全部楼层
你这个出错是必然的,15-20=-5,在内存中存储的就是0xFFFFFFFB,但因为他们是无符号数,所以编译得到的指令按无符号处理,即4294967291。然后把4294967291赋值给double,能不出错吗?

MISRA-C规范是禁止这么写的,因为这么写实际就是把混合运算的符号处理的解释权交给了编译器。你看,你的理解跟我的理解就不一样,如果我们两个各写一个C编译器,那对同一段代码编译的结果就不一样。

正常做法应该自己保留解释权,所以按下面写才是对的,而且兼顾了运算效率:
unsigned int a;
unsigned int b;
double c;
a=15;
b=20;

c=(double)( (int)a-(int)b);

出300入477汤圆

发表于 2023-2-1 10:23:20 | 显示全部楼层
double c=(int)(a-b);
这样就行了。两个unsigned相减的结果直接转为int结果就是对的。这种情况下不管是用int还是unsigned来做计算都行,补码的计算规则保证了这两者是完全一样的。
汇编的加减指令根本就不区分有无符号
只有把这个结果转为double的时候才要区分

出0入8汤圆

发表于 2023-2-1 13:38:18 来自手机 | 显示全部楼层
楼主的错误很好理解

出0入91汤圆

 楼主| 发表于 2023-2-1 13:57:53 | 显示全部楼层
rube 发表于 2023-2-1 13:38
楼主的错误很好理解
(引用自14楼)

是的  但是这种坑 没踩过的人 很难察觉  

出0入91汤圆

 楼主| 发表于 2023-2-1 13:58:24 | 显示全部楼层
PPS 发表于 2023-2-1 10:09
你这个出错是必然的,15-20=-5,在内存中存储的就是0xFFFFFFFB,但因为他们是无符号数,所以编译得到的指令 ...
(引用自12楼)

是的  我这样就不规范了  相当于不同的编译器出来的结果还可能不一样了

出0入0汤圆

发表于 2023-2-1 15:00:21 | 显示全部楼层
1. 无符号的减,可以,结果也是一样的,但赋值给8B的Double时,要转换成有符号的。
2. 如果代码要有可移植性,建议用u32这种,明确定义表达式中的是32位整数,以避免在8位机和16位机,32位机得到的结果不同。

出0入0汤圆

发表于 2023-2-1 15:51:52 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2023-2-1 15:52:10 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入91汤圆

 楼主| 发表于 2023-2-1 15:59:00 | 显示全部楼层

现在人工智能 这么牛了吗?

出0入0汤圆

发表于 2023-2-1 16:06:53 | 显示全部楼层
同意8楼写法

出300入477汤圆

发表于 2023-2-1 16:11:03 来自手机 | 显示全部楼层
weavr 发表于 2023-2-1 15:52

(引用自19楼)

上面那个是把unsigned直接转为double,是错的。
应该强转为int再赋值给double

出0入4汤圆

发表于 2023-2-1 16:11:55 来自手机 | 显示全部楼层
weavr 发表于 2023-2-1 15:51

(引用自18楼)

这个牛逼的网页可以分享出来吗?

出30入42汤圆

发表于 2023-2-1 16:16:38 | 显示全部楼层
huangxiaolpbany 发表于 2023-2-1 16:06
同意8楼写法
(引用自21楼)

不同意8楼的写法,两个浮点运算效率低。

出0入0汤圆

发表于 2023-2-1 16:21:17 | 显示全部楼层
redroof 发表于 2023-2-1 16:11
上面那个是把unsigned直接转为double,是错的。
应该强转为int再赋值给double
(引用自22楼)

是的,有个错了

出0入0汤圆

发表于 2023-2-1 16:22:17 | 显示全部楼层
Landmark 发表于 2023-2-1 16:11
这个牛逼的网页可以分享出来吗?
(引用自23楼)

最近很火的ChatGPT

出0入0汤圆

发表于 2023-2-1 16:41:45 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-16 10:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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