【发布时间】:2020-10-17 21:06:33
【问题描述】:
我想知道在各种位的无符号整数之间的表达式(即 uint8_t、uint16_t 等)的情况下如何隐式转换工作以及显式避免它的方法。为此,我总结了以下几个案例:
- 在 uint8_t 加法、减法、乘法、除法的情况下如何进行隐式转换?
uint8_t A;
uint8_t B;
uint16_t C;
C= A+B; (uint8_t + uint8_t )
C= A-B; (uint8_t + uint8_t )
C= A*B; (uint8_t + uint8_t )
C= A/B; (uint8_t + uint8_t )
显式声明是 C= static_cast
- 在 unsigned int(使用 U 字面量)和 uint8_t 表达式的情况下,隐式转换如何工作? 重要的顺序之间是否也有区别,即 1UB;(unsined int * uint8_t ) 或 B1U;(uint8_t * uint8_t )
C= A+1U;(uint8_t + uint8_t )
C= A-1U;(uint8_t - uint8_t )
C= 1U*B;(uint8_t * uint8_t )
C= 1U/B;(uint8_t / uint8_t )
显式转换为 C= static_cast
- 表达式中的隐式转换如何工作。是否考虑了正常顺序? 表达式的最终类型是什么?
C= 1U/(A-1U); (unsigned int / (uint8_t -(unsigned int))
C= (C-(A/B))/B; (uint8_t -(uint8_t /(unsigned int))/(uint8_t)
在这种情况下 static_cast 应该如何看待?只有第一个变量(1U 或 C)会为其余变量定义
C= static_cast
- 标准函数的隐式转换如何工作
sizeof(A) returns size_t
C=abs(-1*A) returns int in case of int parmaters
显式转换为 C= static_cast
- 函数参数的隐式转换如何工作。
uint16_t sum(uint16_t C1,uint16_t C2);
C=sum(A,B-1U/2U);
C=sum(A,1U/2U-B);
显式转换为 C= sum(static_cast
我在 Opencv 中看到了一个类似于 static_cast 的函数,叫做 saturate_cast。在上述任何一种情况下,它会是一个更好的解决方案吗?
【问题讨论】:
-
你的问题是什么?
-
The way to avoid避免什么?The correct approach请定义“正确”。 -
@Cortex:主要是我需要知道表达式中的隐式转换顺序是如何执行的。例如C=1U/(A-1U); (unsigned int / (uint8_t -(unsigned int)) C= (C-(A/B))/B; (uint8_t -(uint8_t /(unsigned int))/(uint8_t)上面的表达式在右边
-
@KamilCuk:我将描述更改为更易于理解。请参阅我上面的评论作为这个问题的简要总结。
-
我认为一本好书和研究会比 stackoverflow 更能帮助你。
标签: c++ implicit-conversion static-cast explicit-conversion