Значение unsigned long int
9223372036854775808
, выводимое этим оператором
cout<<strtoul(ptr,NULL,2)<<endl;
, не может быть представлено в объекте типа signed long int
.
В этом операторе
long l1=strtol(ptr,NULL,2);
, поскольку значение не представляется в типе signed long int
, функция strtol
возвращает LONG_MAX
(поскольку в строке нет знака минус). И это значение выводится этим оператором
cout<<"l1= "<<l1<<endl;
из стандарта C (7.22.1.4 Функции strtol, strtoll, strtoul и strtoull)
8 Strtol Функции strtoll, strtoul и strtoull возвращают преобразованное значение, если оно есть. Если преобразование не может быть выполнено, возвращается ноль. Если правильное значение находится за пределами диапазона представимых значений, возвращается LONG_MIN, LONG_MAX, LLONG_MIN, LLONG_MAX, ULONG_MAX или ULLONG_MAX (в соответствии с типом и знаком возвращаемого значения, если они есть), и значение макроса ERANGE хранится в errno.
Однако значение представляется в виде unsigned long int
. Таким образом, этот вызов функции strtoul
возвращает правильное значение
long l2=strtoul(ptr,NULL,2);
, но значение присваивается объекту типа signed long int
. Таким образом, его наиболее значимый бит интерпретируется как знаковый бит, а следующий оператор
cout<<"l2= "<<l2<<endl;
выводит значение LONG_MIN
.