完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
嗨,可能是个愚蠢的问题。我有两个像这样的无符号变量(XC32):当在两个变量之间求差时,我得到一个有符号的结果(即,在某个点上可能有负值)。为了纠正这个问题,我得到了结果的绝对值。我的问题是:我能配置XC吗?32,使得两个无符号变量的差值也是无符号的,从而避免了用户的绝对设计错误。欢迎任何评论。
|
|
相关推荐
15个回答
|
|
|
您没有显示如何进行减法。如果只是将其存储回无符号变量,那么它将完全按照您希望的方式执行。如果希望将无符号结果存储回有符号变量,则在存储之前对结果进行强制转换。注意,获取有符号结果的绝对值是与强迫一个未签名的结果不一样。也许你应该更好地解释你想要做的事情。
|
|
|
|
|
|
我还是要得到你想要达到的:两个之间的“距离”还是简单的差异?
|
|
|
|
|
|
我想你是对的,Simon。OP只想要差值的绝对值,所以宏只使用无符号运算就可以正确地执行它。
|
|
|
|
|
|
谢谢大家的回复。我所做的是测量计时器的时间,比如:首先捕获初始值:+然后计算经过的时间是否大于所需的.app_uart2..ValueTMR,以及getValueTemp()返回的值是否为无符号int以避免负值,我使用obtai函数绝对值(ABVAL)
|
|
|
|
|
|
在这种情况下,您应该使用无符号算法。尝试:这将正确地处理时间计数回滚到零的情况。
|
|
|
|
|
|
起初我是这样做的,但是当我发现得到的时间少于300ms时,我求助于绝对值,并且它工作得很好。我只是想知道有没有办法将编译器配置为不使用绝对值函数。
|
|
|
|
|
|
嗯?这样做是正确的。它将给出低于300ms的结果,直到300ms过去为止。请给出两个数字的例子以及您得到的结果。听起来好像你没有正确描述你的要求。
|
|
|
|
|
|
嗯?这样做是正确的。它将给出低于300ms的结果,直到300ms过去为止。请给出两个数字的例子以及您得到的结果。听起来你好像没有正确地描述你的要求。对不起,我想说的是超过300毫秒。
|
|
|
|
|
|
对于unsigned,如果第二个数字正在增加,直到到达起始数字,您将得到正确的差值,编译器将对两个unsigned值执行unsigned算术-因此,除非计时器值正在减少,否则它将使用简单的示例,即虚构的3bit类型来完成简单(值0-7)-无符号3bitstart;无符号3bitend;start=gettimer();//(0-7)wait...end=gettimer();//(0-7)我们的数据-假设start是4,那么所有可能的end值都会显示,并且结束start将始终被校正,直到结束到达start(请出您的二进制计算器以检查是否正确)。开始、结束、开始、结束、开始(无符号运算)4、04、5、14、6、24、7、34、0、44、1、54、2、64、37现在将3位数改为32位相同
|
|
|
|
|
|
减去两个无符号int将导致一个无符号int;即没有负值。既不需要绝对值也不需要铸造。什么是3300毫秒?
|
|
|
|
|
|
Qub(某种方式)已经给出正确答案:无符号数学完全处理翻转!因此,只需从当前时间中减去开始时间(不管是否发生翻转),并测试结果是否大于您的时间间隔。没有华丽的Acess(),没有华丽的浮点数或任何东西:简单的无符号整数数学。
|
|
|
|
|
|
减去两个无符号int将导致一个无符号int;即没有负值。既不需要绝对值也不需要铸造。什么是3300毫秒?假设定时器是16位,因此它的值从0x000到0xFFFF不等。假设定时器的5个值得到300ms,也就是说,如果定时器从0开始,当输入5,300ms的值已经过去时。做一个表步骤|.值tmr-CapturedValue|0|0xFFFE.|0xFFFE.|0xFFFE.|0xFFFE.|0xFFFFFE.|0xFFFFFFFFFFFFFF.–0xFFFE.–0x0000xFFFE.=+1<52|0x0000 0 0 0.–0xFFFE 0.–0xFFFE 0x0000.–0xFFFE 0.–0xFFFE 0x0000.–0x0000x000FFFE=-1<53|0x0000000000000001.|0x0000000001.|0x0000001 1.|0FE=-3<55|0x0003-0xFFFE=-4<56|0x0004--0xFFFE=-5<5到目前为止,计时器已经计数了超过5个步骤,这意味着已经超过300ms。为了解决这个问题,我试图执行以下操作,但是它没有工作,我不得不求助于提取绝对值o的函数:f一个数字。一切正常。我只想知道编译器是否能够被配置成使得两个数字之间的差异结果是无符号的。
|
|
|
|
|
|
那么也许您应该为XC32编译器使用无符号的短(16位)而不是无符号的int(32位)。如前所述,无符号减法会产生无符号的结果,即,步骤|tmr-CapturedValue0|0xFFFE-0xFFFE=0的瞬时值<51|0xFFFFFF-0xFFFE=1<52|0x0000-0xFFFE=2<53|0x0001-0xFFFE=3<54|0x0002-0xFFFE=4<55|0x0003-0xFFFE=5==56|0x0004-0xFFFE=6>5没有配置,这是标准C。这是无符号整数的魔力。;)
|
|
|
|
|
|
只有上面是一个例子,为了让它更容易理解,我实际上使用的是32位的核心定时器。
|
|
|
|
|
|
在这种情况下,它应该只是工作。给我们一些数字,它没有。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1122浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
872浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 21:56 , Processed in 0.919419 second(s), Total 100, Slave 83 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2116