我有 32 位内的某个 18 位(2 的补码)。我需要将它们转换为十进制。请给我看一段 C 代码片段。
首先你需要做符号扩展 http://en.wikipedia.org/wiki/Sign_extension在你的18位上,填写本机int
:
const int negative = (smallInt & (1 << 17)) != 0;
int nativeInt;
if (negative)
nativeInt = smallInt | ~((1 << 18) - 1);
else
nativeInt = smallInt;
如果该数字被认为是负数(即设置了位 17),我们将使用所有剩余位中都有 1 的位模式对其进行按位或。这将创建正确的负本机大小整数。
然后像往常一样打印本机整数,因为听起来好像您需要十进制字符串表示形式:
char buf[12];
snprintf(buf, sizeof buf, "%d", nativeInt);
当然,最后一部分可能根本不符合您的期望;它可能不是“最快的”。由于输入范围有限,为 18 位,因此可能可以提出更优化的方案。
一些想法:
- 删除缓冲区大小参数(即使用
sprintf()
)因为我们可以非常确定所需的最大字符数。
- 因为我们知道范围,所以使用不太通用的东西,从不检查范围之外的值。
- Use
itoa()
如果你有的话,不那么一般s*printf()
所以可能会更快。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)