簡體   English   中英

如何在C ++中將UINT8轉換為UINT32?

[英]How do you convert UINT8 to UINT32 in C++?

我有一個UINT8類型的值,我想把它作為UINT32

我的以下代碼是否會被認為是正確,有效,高效和安全的?

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

請注意,我是來自Java世界的C ++的新角色。

函數是正確的( return *result;*的錯誤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);
}

更好,並首先避免指針

事件最好避免函數調用並在相應的代碼行中鍵入靜態強制轉換。

 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;

我會做而不是使用這個功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM