首页 > 解决方案 > 将数组中的字节添加到单个值中,将无符号字节添加到 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一直警告算术溢出,左移计数大于操作数大小,帮助。

标签: c++

解决方案


隐式积分提升

整数类型(例如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 和向前获取编译时间常量(给定输入)。


推荐阅读