如何在不改变顺序的情况下将int64值移位到无符号int64空间
How to shift int64 value to unsigned int64 space without changing the order?
例如:
- INT64_MIN到0
- 0到INT64_MAX+1
- INT64_MAX到UINT64_MAX
以下是我的代码:
uint64_t int64ToUint64(int64_t value)
{
uint64_t uvalue = value - std::numeric_limits<int64_t>::min();
return uvalue;
}
它是有效的,但存在有符号整数溢出,并且根据C++标准,有符号整数溢流是未定义的行为。还有其他没有整数溢出的解决方案吗?
由于从有符号类型到无符号类型的转换定义良好,并且无符号算术没有溢出,因此可以通过首先将有符号值转换为无符号类型来安全地执行所需操作:
uint64_t int64ToUint64(int64_t value)
{
uint64_t uvalue = value;
uvalue += INT64_MAX;
uvalue += 1;
return uvalue;
}
uint64_t int64ToUint64(int64_t value){
uint64_t res = *(reinterpret_cast<uint64_t*>(&value));
return res ^ numeric_limits<int64_t>::min();
}
int64_t uint64ToInt64(uint64_t value){
value ^= numeric_limits<int64_t>::min();
return *(reinterpret_cast<int64_t*>(&value));
}
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- OpenGL相机和相机空间转型的困惑
- CUDA内核和数学函数的显式命名空间
- 打印第二列时的2d字符矢量打印空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 如何在不改变顺序的情况下将int64值移位到无符号int64空间