我的类型为UINT8
,我想将其设为UINT32
。
我的下列代码是否会被认为是正确,有效,高效和安全的?
UINT32 convU8toU32(UINT8 *number) {
UINT32 result = *number;
return *result;
}
请注意,我是来自Java世界的C ++的新角色。
答案 0 :(得分:7)
该功能原样正确(*
旁边的return *result;
错字),但您甚至不需要它。整数(和其他整数类型)隐式转换为彼此,并且UINT32
可以表示UINT8
可以拥有的每个值,您只需编写
UINT32 target = source;
某些UINT8 source
。
使用static_cast
明确转换是可选的;如果转换(可能)缩小,则演员会使一些编译器警告静音。
答案 1 :(得分:4)
你需要
UINT32 result = static_cast<UINT32>(*number);
取消引用指针并将其转换为正确的类型
但是
UINT32 convU8toU32(UINT8 number) {
return static_cast<UINT32>(number);
}
更好,并首先避免指针
事件最好避免函数调用,并在相应的代码行中键入静态强制转换。
答案 2 :(得分:4)
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;
答案 3 :(得分:3)
嗯,不。假设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;
将代替使用此功能。