我想知道如何在各种位(即 uint8_t,uint16_t 等)的无符号 int 之间进行表达式的情况下隐式转换工作,以及明确避免它的方法。出于这个原因,我列举了以下情况:
- 在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_castA+B;或 C= static_cast
- 在无符号 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_castA+1U; 或 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的函数。在上述任何一种情况下,它会是一个赌注解决方案吗?
uint8_t加法、减法、乘法、除法的情况下,隐式转换将如何工作?
uint8_t
的转换秩小于类型int
并且类型int
总是可以存储uint8_t
的整个值范围,UINT8_MAX
是 255,int
至少有16 位。uint8_t
将在操作员之前通过整体提升提升为int
。CPP偏好 积分促进基本类型 CSTDINT
或 C= static_cast
(A+B);。这是对的吗?
不。这些不是声明的示例,缺少类型说明符。他们使用operator=
为对象C
赋值。"显式声明"是使用auto
关键字的声明。CPP 首选项声明
; 或 C= static_cast
(A+B) 之间有什么区别吗?
是的,在int
无法容纳uint16_t
的所有值范围的架构上。在这种特殊情况下,第一个表达式首先将运算符+
操作数提升为unsigned int
,而第二个表达式使用int
类型进行运算。第二个表达式与C = A + B
相同,因为C
的类型为uint16_t
。除了这种特殊情况,在int
可以容纳所有uint16_t
值范围的架构上,两个操作数都将提升为int
。C= static_cast<uint16_t>(A+B)
与C = A + B
相同。
在无符号 int(带有 U 文字)和 uint8_t 的表达式的情况下,隐式转换将如何工作?
首先,两个操作数都进行积分提升。unsigned int
留下来,uint8_t
晋升为int
。然后操作数进行积分转换。由于其中一个操作数unsigned
并且两个操作数具有相同的转换等级,因此有符号操作数将转换为无符号类型,即。int
转换为unsigned int
。算术运算符和算术转换
重要的顺序之间是否有区别,即
1U*B;(unsined int * uint8_t )
或B*1U;(uint8_t * uint8_t )
不,操作数的顺序无关紧要。
显式转换将是 C= static_cast; 或 C= static_cast
(A+1U);C= static_cast 1UB;或 C= static_cast (1UB);。正确吗 这些线之间有什么区别吗?
static_cast<uint16_t>1UB
是语法错误。C = static_cast<declatype(C)>(expr)
总是等于C = expr
。
表达式情况下的隐式强制转换将如何工作。是否考虑了正常订单?
我不明白什么是"正常秩序"。操作数和表达式根据其优先级进行评估。
表达式的最终类型是什么?
C= 1U/(A-1U); (unsigned int / (uint8_t -(unsigned int))
operator=
右侧的表达式是unsigned int
类型的右值。
C= (C-(A/B))/B; (uint8_t -(uint8_t /(unsigned int))/(uint8_t)
operator=
右侧的表达式是unsigned int
类型的右值。
在这种情况下,static_cast应该是什么样子?
像其他任何地方一样static_cast<type>(expr)
只有第一个变量(1U 或 C)会为其余变量定义 C= static_cast
(1U)/(A-1U);
每个运算符分别计算其操作数,一次计算一个或两个表达式。评估(以及升级)的顺序根据操作员的优先级进行排序。评价顺序、优先顺序和结合性
在标准函数的情况下,隐式强制转换将如何工作?
与根据整数促销规则的任何其他类型一样。size_t
只是一个定义的无符号整数类型的实现。
显式转换将是 C= static_cast
sizeof(A) 和 C= static_cast abs(-1*A)。这是对的吗?
这两个表达式都是语法错误。这是static_cast<type> ( expression )
.牙套是强制性的。答案见上文 - 做C = static_cast<decltype(C)>(expr)
正好等于C = expr
。
那么 C= static_cast
abs(-1)*A) 呢?
怎么样?
函数参数情况下的隐式强制转换将如何工作。
当参数不是可变参数函数调用中省略号的一部分时,参数将转换为参数类型。
显式转换将是 C= sum(static_cast
(A),static_cast (B-1U/2U))。这是对的吗?
是的,但是为了什么?无论如何,它们都会转换为uint16_t
。
我在Opencv中看到了一个类似于static_cast称为
saturate_cast
的函数。在上述任何一种情况下,它会是一个赌注解决方案吗?
"更好"是基于意见和模糊的。这取决于你想要实现什么。saturate_cast
是一个简单的模板,专门处理具有范围刨丝器然后是目标范围的类型。在这种情况下,参数将转换为该类型的最大值/最小值。
为了进一步的研究,C++标准的草案可以在线获得。