首页 > 解决方案 > __builtin_bswap16 是否可用于签名短片?

问题描述

我正在尝试交换 16 位有符号数

所以我写了这个运行良好的逻辑:

// Byte swap signed short
inline int16_t swap_int16( int16_t val )
{
    return (val << 8) | ((val >> 8) & 0xFF);
} 

但我观察到在 gcc 编译器中,以下交换函数可用于无符号短变量。 https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

Built-in Function: uint16_t __builtin_bswap16 (uint16_t x)
Returns x with the order of the bytes reversed; for example, 0xaabb becomes 0xbbaa. Byte here always means exactly 8 bits. . 

但我没有找到内置交换功能的签名短。

它在GCCg++中可用吗?

标签: c++c

解决方案


它在 GCC 或 g++ 中可用吗?

没有。记录在案的内置函数列表是详尽的。没有秘密签名的 bswap。

另一方面,也几乎不需要使用内置函数。只要启用了优化器,使用按位运算符与内置函数一样快,并且与 GCC 内置函数不同,按位运算符是标准的并且适用于所有编译器。

请注意,从技术上讲,在 C++20 之前,由于参数类型的符号性,当任一字节的最高位为 1 时,您的函数具有实现定义的行为。幸运的是,我所知道的所有实现都会做你希望他们做的事情。从 C++20 开始,行为是标准的,函数是明确正确的。


推荐阅读