htonl() vs __builtin_bswap32()

c, endianness, gcc, linux

Solution

Just look at source code : (example from glib 2.18)

#undef htonl
#undef ntohl

uint32_t
htonl (x)
uint32_t x;
{
    #if BYTE_ORDER == BIG_ENDIAN
       return x;
    #elif BYTE_ORDER == LITTLE_ENDIAN
       return __bswap_32 (x);
    #else
       # error "What kind of system is this?"
    #endif
}
weak_alias (htonl, ntohl)

And : `#define __bswap_32(x) ((unsigned int)__builtin_bswap32(x))`

Source here : http://fossies.org/dox/glibc-2.18/htonl_8c_source.html

As you can see, `htonl` only call `__builtin_bswap32` on little-endian machines.

Problem

`__builtin_bswap32()` is used to reverse bytes (it's used for littel/big endian issues (from gcc)). `htonl()` is used to reverse bytes too (conversion from host to network). I checked both functions and they returns the same result. Are there some one who can confirm that both functions do the same thing? (standard refences are appreciated)

Original source