Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 只是想知道示例中的强制转换是否是冗余的_C - Fatal编程技术网

C 只是想知道示例中的强制转换是否是冗余的

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,则在计算中,强制

只是想知道下面示例中的强制转换是否是冗余的

uint16基本单位=4587U

uint8_t int_val=(uint8_t)((uint16_t)(基本单位*5U))/1000U

我认为(uint16\u t)

基本单位* 5U))/1000U)

这是多余的

只是因为

Uint16\u t是 “无符号短”

uint8_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)