c++ - 将数组中的字节添加到单个值中,将无符号字节添加到 uint64
问题描述
//glues bytes together, into 64bit
UINT64 AppendBytes64(uint8_t* val, int start)
{
UINT64 result = 0;
result = (val[start+0] << 0) | (val[start + 1] << 8) | (val[start + 2] << 16) | (val[start + 3] << 24) | (val[start + 4] << 32) | (val[start + 5] << 40) | (val[start + 6] << 48) | (val[start + 7] << 56);
return result;
}
所以问题是visual studio一直警告算术溢出,左移计数大于操作数大小,帮助。
解决方案
小整数类型(例如
char
)的纯右值可以转换为较大整数类型(例如int
)的纯右值。特别是,算术运算符不接受小于int
作为参数的类型,并且在左值到右值转换后会自动应用整数提升(如果适用)。
为避免隐式转换,您必须自己转换为合适的类型,并使用 C++显式类型转换和无符号 64 位整数的标准类型,std::uint64_t
以及用于索引的无符号类型std::size_t
,它应该看起来像这样:
#include <cstddef>
#include <cstdint>
using std::uint64_t;
constexpr uint64_t AppendBytes64(const uint8_t* val, std::size_t start) {
return static_cast<uint64_t>(val[start + 0]) << 0 |
static_cast<uint64_t>(val[start + 1]) << 8 |
static_cast<uint64_t>(val[start + 2]) << 16 |
static_cast<uint64_t>(val[start + 3]) << 24 |
static_cast<uint64_t>(val[start + 4]) << 32 |
static_cast<uint64_t>(val[start + 5]) << 40 |
static_cast<uint64_t>(val[start + 6]) << 48 |
static_cast<uint64_t>(val[start + 7]) << 56;
}
constexpr
使得可以在常量表达式中使用该函数constexpr
从 C++11 和向前获取编译时间常量(给定输入)。