On 6/6/05, Segher Boessenkool <[EMAIL PROTECTED]> wrote: > > There's also a fair amount of code whih relies on -1 == > > (int)0xFFFFFFFF. > > > > Or is there any truly portable and efficient way to convert a sequence > > of bytes (in big-endian order) to a signed integer? > > Of course there is. Assuming no padding bits:
[snip complicated stuff] Better use a union for the (final) conversion, i.e int conv(unsigned char *c) { unsigned int i; union { unsigned int u; int i; } u; u.u = 0; for (i = 0; i < sizeof u; i++) u.u = (u.u << 8) + c[i]; return u.i; } or even (if you can determine native byte-order and size at compile time) int conv(unsigned char *c) { union { unsigned char c[4]; int i; } x; int i; for (int i=0; i<4; ++i) x.c[3-i] = c[i]; return x.i; } which generates only slightly worse code than above. Richard.