On Tue, Apr 01, 2003 at 01:03:06PM -0500, Rodent of Unusual Size wrote: > is this expected behaviour?
Yes > perl -e 'use POSIX; printf "%08x\n", POSIX::strtol("0xdeadbeef");' > 7fffffff > > perl -e 'use POSIX; printf "%08x\n", POSIX::strtol("0x0eadbeef");' > 0eadbeef In C: $ perl -we 'use Inline C => q(void test (char *src) {printf ("%s: %08x\n", src, strtol (src, NULL, 0));}); test $_ foreach @ARGV' 0xdeadbeef 0x0eadbeef 0xdeadbeef: 7fffffff 0x0eadbeef: 0eadbeef > i haven't looked into it closely, but i suspect sign-bit bogosity. RETURN VALUES The strtol() function returns the result of the conversion, unless the value would underflow or overflow. If an underflow occurs, strtol() returns LONG_MIN. If an overflow occurs, strtol() returns LONG_MAX. The strtoll() function returns the result of the conversion, unless the value would underflow or overflow. If an underflow occurs, strtoll() returns LLONG_MIN. If an overflow occurs, strtoll() returns LLONG_MAX. In all cases, errno is set to ERANGE. strtoul probably does what you want. hex will even try to use doubles if it runs out of space in an unsigned long. Nicholas Clark