cvs commit: src/sys/sys endian.h src/share/man/man9 byteorder.9

Bruce Evans bde at zeta.org.au
Fri Apr 4 22:55:36 PST 2003


On Fri, 4 Apr 2003, Nate Lawson wrote:

> On Fri, 4 Apr 2003, Ruslan Ermilov wrote:
> > +#define	BSWAP16(x)	(uint16_t) \
> > +	(((x) >> 8) | ((x) << 8))
> > +
> > +#define	BSWAP32(x)	(uint32_t) \
> > +	(((x) >> 24) | (((x) >> 8) & 0xff00) | \
> > +	(((x) << 8) & 0xff0000) | ((x) << 24))

> I don't mind the addition of the macros but I don't like the
> implementation.  Too many unnecessary casts and overly complicated.

I fear it has not enough necessary casts :-).  E.g., if x = (int16_t)0xfffe,
then on 32-bit machines sign extension gives 0xffffffff for BSWAP16(x).
Of course, BSWAP16()'s arg should be precisely uint16_t, but the function
interfaces don't require it to have the correct type except possibly on
non-2's complement machines where coercing the arg's type may cause
surprising changes to the arg's value.

Bruce


More information about the cvs-all mailing list