[英]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; }
我在我的回答中假設UINT32
和UINT8
是基本整數類型的花式別名。
我的代碼是否會被考慮
- 正確,有效
不,假設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.