【问题标题】:How do you convert UINT8 to UINT32 in C++?如何在 C++ 中将 UINT8 转换为 UINT32?
【发布时间】:2017-02-20 00:59:41
【问题描述】:

我有一个UINT8 类型的值,我想将其设为UINT32

我的以下代码会被认为是正确、有效、高效和安全的吗?

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

请注意,我是来自 Java 世界的 C++ 新手。

【问题讨论】:

  • 现在你的代码是“正确的”(直到 return *result; 应该是 return result;),但为什么要使用指针而不是简单的 UINT8
  • @M.A.Kishawy 如果您担心内存使用情况,请不要将 8 位整数替换为 32/64 位指针。 ;) 但无论如何,人们通常不必担心那些“浪费”的内存量。
  • @M.A.Kishawy 编译器是一个比你更好的代码生成器。不要考虑“内存使用”,尤其是在这里。无论如何,该参数很可能最终会出现在寄存器中(或者编译器可能只是内联它,如果它真的很聪明,它甚至可以在查看调用者如何使用它时将其设为无操作)。另外,至少在 PC 上,你有千兆字节的内存。
  • @PeteBecker 内置无符号整数类型,宽度分别为 8 位和 32 位,我大胆假设。如果错了,请纠正我OP。
  • @JasonC - 没有什么比现实世界更反常了。工程应该基于知识,而不是未陈述的假设。

标签: c++ pointers visual-c++ int type-conversion


【解决方案1】:

你需要

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

取消引用指针并将其转换为正确的类型

但是会

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

做得更好,一开始就避免使用指针

事件更好地避免函数调用并在适当的代码行中键入静态转换。

【讨论】:

  • 这里实际上不需要static_cast。对于扩大演员表,它与隐式演员表相同,只是增加了冗长。如果您对严格的 C++ 哲学正确性有要求,您可能想要(这没什么错,尽管我个人不喜欢冗长,尤其是与等效的 C 风格转换相比),但您不需要 /i> 它。具有隐式强制转换的原始分配是充分且正确的。
  • “隐式转换” s/cast/conversion/,转换总是显式的。
  • 我在想“现代”C++ 鼓励冗余冗长:)
  • @ddriver C++: Yo dawg,听说你喜欢模板...
【解决方案2】:

该功能是正确的(除了return *result; 中的* 的错字),但您甚至不需要它。整数(和其他整数类型)相互隐式转换,因为UINT32 可以表示UINT8 可以拥有的每个值,您可以简单地编写

UINT32 target = source;

对于一些UINT8 source

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

【讨论】:

    【解决方案3】:
    UINT32 convU8toU32(UINT8 *number) {
      UINT32 result = *number;
      return *result;
    }
    

    我在回答中假设 UINT32UINT8 是基本整数类型的花哨别名。

    是否会考虑我的 [...] 代码

    • 正确,有效

    不,我假设UINT32 是一个整数。您不能取消引用整数。你在return *result;return *result;

    • 高效

    没关系,因为它不正确。

    • 安全

    好吧,它安全地无法编译。


    这应该没问题:

    UINT32 convU8toU32(UINT8 number) {
        return number;
    }
    

    当然,这很简单,你可能要考虑不调用函数,而是一开始就直接赋值:

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

    【讨论】:

      【解决方案4】:

      嗯,不。假设 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;
      

      将代替使用此功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-14
        • 2017-03-11
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多