我想知道在各种位的无符号整数(即 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<uint16_t>A+B; 或 C= static_cast<uint16_t>(A+B);. 这是正确的吗?C= static_cast<uint16_t>A+B; 之间有什么区别吗?还是 C= static_cast<uint16_t>(A+B)?
- 在 unsigned int(使用 U 文字)和 uint8_t 表达式的情况下,隐式转换如何工作?重要的顺序之间是否也有区别,即 1U B;(unsined int * uint8_t ) 或 B 1U;(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<uint16_t>A+1U; 或 C= static_cast<uint16_t>(A+1U); C= static_cast<uint16_t>1UB ;或 C= static_cast<uint16_t>(1UB );. 这是正确的这些行之间有什么区别吗?
- 表达式的隐式转换如何工作。是否考虑到正常顺序?表达式的最终类型是什么?
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<uint8_t >(1U)/(A-1U);
- 标准函数的隐式转换如何工作
sizeof(A) returns size_t
C=abs(-1*A) returns int in case of int parmaters
显式转换为 C= static_cast<uint16_t>sizeof(A) 和 C= static_cast<uint16_t>abs(-1*A)。那是对的吗?C= static_cast<uint16_t>abs(-1)*A) 怎么样?
- 函数参数的隐式转换如何工作。
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<uint16_t>(A),static_cast<uint16_t>(B-1U/2U))。那是对的吗?
我在 Opencv 中看到了一个类似于 static_cast 的函数,称为 saturate_cast。在上述任何情况下,这会是更好的解决方案吗?