c++ - 在映射最小值和最大值时从无符号转换为有符号的最佳方法?

标签 c++ c c++11

有谁知道一个聪明的 C++ 或 C 技巧来施放 uint16_tint16_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 类型的范围内,所以没问题。

关于c++ - 在映射最小值和最大值时从无符号转换为有符号的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55089721/

相关文章:

C++读取字节问题

c++ - 我应该如何使用 mpfr::mpfr_fac_ui 函数?

有人能告诉我为什么我会在这个简单的 C 程序中出现段错误吗?

C++ 日志记录类实例标识符

c++ - 使用 QSslCertificate 在 Qt 中正确导入 pkcs12

c - 基于线程计算分配共享内存

c - 为什么两个指针显示相同的内存地址

c++ - 是否需要删除包含对象的 "pair"?

c++ - 在函数模板中将一种类型名称映射到另一种类型名称

c++ - 使用 Spirit x3,如何控制在每个不同的输入上调用哪个解析器?