如何在c++中将UINT8转换为UINT32 ?

How do you convert UINT8 to UINT32 in C++?

本文关键字:转换 UINT32 UINT8 中将 c++      更新时间:2023-10-16

我有一个类型为UINT8的值,我想把它设置为UINT32

我下面的代码被认为是正确的,有效的,高效的和安全的吗?

UINT32 convU8toU32(UINT8 *number) {
  UINT32 result = *number;
  return *result;
}

请注意,我是从Java世界来的c++新手。

这个函数是正确的(除了return *result;中的*的错别字),但是您甚至不需要它。整数(和其他整数类型)隐式地相互转换,并且由于UINT32可以表示UINT8可以具有的所有值,因此您可以简单地写入

UINT32 target = source;

为某些UINT8 source .

使用static_cast显式转换是可选的;如果转换(可能)窄化,则强制转换将静默一些编译器警告。

你需要

 UINT32 result = static_cast<UINT32>(*number);

解除对指针的引用,并将其强制转换为正确的类型

,但

UINT32 convU8toU32(UINT8 number) {
   return static_cast<UINT32>(number);
}

最好一开始就避免使用指针

Event最好避免在适当的代码行中进行静态强制转换中的函数调用和类型。

UINT32 convU8toU32(UINT8 *number) {
  UINT32 result = *number;
  return *result;
}

我认为UINT32UINT8是基本整数类型的花哨别名。

我的……代码

  • 正确的,有效的

不,假设UINT32是一个整数。不能对整数解引用。这就是你在return *result;

    效率

不重要,因为它是不正确的。

编译失败。


这个应该没问题:

UINT32 convU8toU32(UINT8 number) {
    return number;
}

当然,这太简单了,您可能想要考虑不调用该函数,而是直接赋值:

// not UINT32 foo = convU8toU32(some_uint8);
// but instead:
UINT32 foo = some_uint8;

不。假设UINT32是32位无符号整型,UINT8是8位无符号整型,您的代码

UINT32 convU8toU32(UINT8 *number) {
   UINT32 result = *number;
   return *result;
}

甚至不能编译。原因是整型不能像指针一样解引用。因此,语句return *result将无法编译,更不用说执行了。

实际上,将8位无符号整型值转换为32位无符号整型非常简单。

UINT32 convU8toU32(UINT8 number)
{
   UINT32 result = number;
   return result;
}

或者更简单的

UINT32 convU8toU32(UINT8 number)
{
   return number;
}

依赖于到32位无符号整型的隐式转换。由于32位无符号整型可以精确地表示8位无符号整型可以表示的所有值,因此转换保留值。另一种转换方式(从32位到8位)可能会失去价值。

如果要避免隐式转换,只需执行显式转换,例如

UINT32 convU8toU32(UINT8 number)
{
    return (UINT32) number;    // C-style conversion - discouraged in C++
}

UINT32 convU8toU32(UINT8 number)
{
    return UINT32(number);
}

(真正使任何人都能明显地看到,并且在搜索源文件时容易找到)
UINT32 convU8toU32(UINT8 number)
{
    return static_cast<UINT32>(number);
}

当然,甚至不需要函数

 UINT8 value8 = something();
 UINT32 value32 = value8;