C 只是想知道示例中的强制转换是否是冗余的
只是想知道下面示例中的强制转换是否是冗余的 uint16基本单位=4587U uint8_t int_val=(uint8_t)((uint16_t)(基本单位*5U))/1000U 我认为(uint16\u t)在 基本单位* 5U))/1000U) 这是多余的 只是因为 Uint16\u t是 “无符号短” 及 uint8_t只是未签名的 煤焦C 只是想知道示例中的强制转换是否是冗余的,c,C,只是想知道下面示例中的强制转换是否是冗余的 uint16基本单位=4587U uint8_t int_val=(uint8_t)((uint16_t)(基本单位*5U))/1000U 我认为(uint16\u t)在 基本单位* 5U))/1000U) 这是多余的 只是因为 Uint16\u t是 “无符号短” 及 uint8_t只是未签名的 煤焦 uint8\u tcast是冗余的。如果在除以1000之前,uint16\u t基本单位*5U将溢出一个正常的uint16\u t,则在计算中,强制
uint8\u t
cast是冗余的。如果在除以1000之前,uint16\u t
基本单位*5U将溢出一个正常的uint16\u t
,则在计算中,强制转换可能具有截断中间值的(非)预期结果。请详细说明冗余部分。您试图做的事情是一种不安全的做法,并且在进行缩短转换(将16位转换为8位)时非常不可取
附言
写uint8_t int_val=(uint8_t)((基本单位*5U)/1000U)就足够了 如果
basic_units
等于20000,且unsigned int
大于16位,则它会改变结果,因此不冗余。这可能是错误的,这取决于你想要的结果。但是在这个例子中,basic_units
仅为4587,我不确定问题是否只是关于这一个值。最大可能的basic_units为7000,我使用的是MSP430.+1,假设unsigned int
大于16位,问题不应该只是给定的值4587
。基本单位*5U永远不会溢出uint16。因此,我认为我可以安全地删除uint8和uint16的强制转换。请告诉我。@Ammamon:如果你愿意假设它永远不会溢出,那么就移除石膏。它暗示了一些永远不会发生的事情的可能性,因此只会减慢读者的阅读速度。如果基本单位
将来可能会发生变化,那么选择能够产生正确结果的单位。还要注意的是,假设没有换位符,您只需除以200,因此在这种情况下乘法也是多余的;-)谢谢你,史蒂夫。你是对的。我也可以除以200。但为了使域逻辑的实现更清晰,我希望保留5U和1000U。(稍后,我将这些更改为已定义的常量)。再次感谢您耐心地回答这个琐碎的问题。谢谢您的代码骑士。我确信表达式的右边总是小于255。我现在添加了一个断言,如下所示。uint16_t val=((基本单位*5U)/1000U);断言(val)