在映射最小值和最大值时从未签名转换为已签名的最佳方法?

Best way to cast from unsigned to signed while mapping the minimal and maximal?

本文关键字:最佳 方法 转换 映射 最大值 最小值      更新时间:2023-10-16

有谁知道一个聪明的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那里会有类型longuv将转换为类型long保留其值。根据定义,结果在类型int16_t的范围内,所以没问题。