有谁知道一个聪明的 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++ - 在映射最小值和最大值时从无符号转换为有符号的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55089721/