c - 有效地将无符号转换为有符号

标签 c optimization casting c99

当我想要将一个无符号短整型转换为有符号短整型时,我总是减去 32768。

这是最快的方法吗?还是有更快的方法?

最佳答案

如果该值在 0 到 SHRT_MAX(含)之间,则无需担心,并且转换 ((short)) 是可选的(除非您的编译器是偏执或配置为偏执)。

如果无符号短值可以大于SHRT_MAX,则将其转换为的唯一合法方法是:

#include <limits.h>

short ushort2short(unsigned short s)
{
  if (s <= SHRT_MAX)
    return s; // or return (short)s;
  s -= SHRT_MAX + 1; // now s is 0 ... SHRT_MAX
  return (short)s - SHRT_MAX - 1;
}

当然,这依赖于带符号的 Shorts 是 2 的补码,即 SHRT_MIN = -SHRT_MAX - 1。

现代编译器将优化该函数内的所有废话,只生成返回 s 的代码。

编辑:使用 gcc 4.6.2 将上述内容编译为 gcc -Wall ush2sh.c -O2 -S -o ush2sh.s 到此汇编代码:

        .file   "ush2sh.c"
        .text
        .p2align 2,,3
        .globl  _ushort2short
        .def    _ushort2short;  .scl    2;      .type   32;     .endef
_ushort2short:
LFB0:
        .cfi_startproc
        movl    4(%esp), %eax
        ret
        .cfi_endproc
LFE0:

关于c - 有效地将无符号转换为有符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14756974/

相关文章:

C (s)printf 漏洞利用,$hn 和 %10

c - 释放 C 中的内存 : Queue

algorithm - 最快的固定长度 6 int 数组

c++ - 预序列化原始消息的某些字段

r - 如何将因子转换为整数\数字而不丢失信息?

创建以太网 II 帧头?

可以在 posix_spawn 的 argv 中传递字符串文字吗?

c++ - 用指针替换循环索引器有什么好处吗?

c++ - 如何通过引用或指针将 `int` 和 `unsigned int` 成员传递给同一个函数?

java - java 中的原始数据类型转换 - 内部逻辑