C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t

Implicit conversion in c++ for between unsigned types of bit length ie uint8_t,uint16_t

本文关键字:转换 uint8 uint16 无符号 之间 类型      更新时间:2023-10-16

我想知道如何在各种位(即 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_cast

A+B;或 C= static_cast(A+B);。这是对的吗?C=static_castA+B有什么区别吗?还是 C= static_cast(A+B)?

  • 在无符号 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

A+1U; 或 C= static_cast(A+1U); C= static_cast1U B;或 C= static_cast(1U B);.这是正确的吗 这些线之间有什么区别吗?

  • 表达式情况下的隐式强制转换将如何工作。是否考虑了正常订单? 表达式的最终类型是什么?

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(1U)/(A-1U);

  • 在标准函数的情况下隐式强制转换将如何工作

sizeof(A) returns size_t 
C=abs(-1*A) returns int in case of int parmaters    

显式强制转换将是 C= static_castsizeof(A) 和 C= static_castabs(-1*A)。这是对的吗? 那么 C= static_castabs(-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(A),static_cast(B-1U/2U))。这是对的吗?

我在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_castA+B;

或 C= static_cast(A+B);。这是对的吗?

不。这些不是声明的示例,缺少类型说明符。他们使用operator=为对象C赋值。"显式声明"是使用auto关键字的声明。CPP 首选项声明

C= static_castA+B

; 或 C= static_cast(A+B) 之间有什么区别吗?

是的,在int无法容纳uint16_t的所有值范围的架构上。在这种特殊情况下,第一个表达式首先将运算符+操作数提升为unsigned int,而第二个表达式使用int类型进行运算。第二个表达式与C = A + B相同,因为C的类型为uint16_t。除了这种特殊情况,在int可以容纳所有uint16_t值范围的架构上,两个操作数都将提升为intC= 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_castA+1U

; 或 C= static_cast(A+1U);C= static_cast1UB;或 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_castsizeof(A) 和 C= static_castabs(-1*A)。这是对的吗?

这两个表达式都是语法错误。这是static_cast<type> ( expression ).牙套是强制性的。答案见上文 - 做C = static_cast<decltype(C)>(expr)正好等于C = expr

那么 C= static_castabs(-1)*A) 呢?

怎么样?

函数参数情况下的隐式强制转换将如何工作。

当参数不是可变参数函数调用中省略号的一部分时,参数将转换为参数类型。

显式转换将是 C= sum(static_cast(A),static_cast(B-1U/2U))。这是对的吗?

是的,但是为了什么?无论如何,它们都会转换为uint16_t

我在Opencv中看到了一个类似于static_cast称为saturate_cast的函数。在上述任何一种情况下,它会是一个赌注解决方案吗?

"更好"是基于意见和模糊的。这取决于你想要实现什么。saturate_cast是一个简单的模板,专门处理具有范围刨丝器然后是目标范围的类型。在这种情况下,参数将转换为该类型的最大值/最小值。

为了进一步的研究,C++标准的草案可以在线获得。