在映射最小值和最大值时从未签名转换为已签名的最佳方法?
Best way to cast from unsigned to signed while mapping the minimal and maximal?
有谁知道一个聪明的C++或C技巧,可以将uint16_t
投射到int16_t
,同时从[0; 65535]
映射到[−32768; 32767]
?
我尝试了static_cast<std::int16_t>(value - std::numeric_limits<std::int16_t>::lowest())
,但我不确定这是否是最佳解决方案。 那么最好的方法是什么?
虽然这个问题主要集中在C++11,但C答案也是受欢迎的。
如果你想将[0 .. 65535]
映射到[-32768 .. 32767]
,不需要魔法c++咒语:只需减去32768
。如果您的平台有 32 位整数,整数提升将使以下表达式完全定义:
uint16_t uv = <some value>;
int16_t sv = uv - 32768;
如果类型int32_t
可用,您可以编写:
uint16_t uv = <some value>;
int16_t sv = (int32_t)uv - 32768;
但是第一个版本也是在具有 16 位整数的平台上完全定义的,因为32768
那里会有类型long
,uv
将转换为类型long
保留其值。根据定义,结果在类型int16_t
的范围内,所以没问题。
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?