gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:48:14 25 4
gpt4 key购买 nike

有谁知道一个聪明的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com