2016-06-07 4 views
5

Następujący program C++ wywołuje strtoul z wyniku ujemnego 1. Ponieważ nie można podać żadnych liczb ujemnych w żadnym typie bez znaku, oczekiwałem, że to się nie powiedzie i zwróci 0 (If no valid conversion could be performed, a zero value is returned.), ale zamiast tego duża liczba dodatnia jest zwracana (If the value read is out of the range of representable values by an unsigned long int, the function returns ULONG_MAX (defined in <climits>), and errno is set to ERANGE.).C/C++ strtoul o numerze ujemnym

#include <cstdlib> 
#include <iostream> 

int main() { 
    {char s[] = "-1"; 
    for (int b=0; b<17; ++b) 
     std::cout << "strtoul (unsigned) of " << s 
       << " with base arg " << b 
       << ": " << strtoul(s,0,b) << std::endl;} 
} 

Dlaczego strtoul nie zawiedzie i zwraca 0 dla liczb ujemnych?

+1

Jaki jest Twój system operacyjny? Kompilator? Środowisko wykonawcze C/C++? –

+0

@AndrewHenle. Nieistotne w tym przypadku. Funkcja demonstruje prawidłowe zachowanie. –

+1

@ Galik. Nie prawda. To tylko ** zwraca ** niepodpisane liczby. –

Odpowiedz

2

Lepiej użycie cppreference.com dla documentation wydaje się być znacznie bardziej precyzyjne:

jeśli znak minus był częścią sekwencji wejściowej, wartość liczbowa obliczany z sekwencji cyfr zostaje zanegowane jako jeśli przez jednoargumentowy minus w typie wyniku, który stosuje się bez znaku całkowitych reguł zawijania.

jak wspomniano tam opcjonalny znak plus albo minus to ważny symbol

+3

Co jest niedokładne w dokumentacji cplusplus.com? –

+0

Przynajmniej nie jest tak kompletny jak ten, co oznacza, że ​​nie jest dokładny – Slava

+0

@BenjaminLindley.Fakt, że wypisują '++' zamiast używać wyraźnie zrozumiałego obcięcia. –

2

Per the POSIX standard:

Od 0, {ULONG_MAX} i {ULLONG_MAX} są zwracane w przypadku błędu i są również ważne zwroty z powodzeniem, aplikacja chcąc sprawdzić sytuacje błędach należy ustawić errno do 0, a następnie zadzwonić strtoul() lub strtoull(), następnie sprawdź errno.

Musisz sprawdzić errno.

+0

errno wynosi 0 co najmniej dla RH 6.6 i gcc 5.1.0 – Slava

+0

@Slava '-1' nie będzie" poza zakresem reprezentowalnych wartości ". –

0

Od innym numerem: cppreference.com:

Zwracana wartość

Wartość całkowita odpowiadająca treści str na sukcesie. Jeśli przekształcona wartość wypada poza zakres odpowiedniego typu powrotu, pojawia się błąd w zakresie i zwracane są ULONG_MAX lub ULLONG_MAX. Jeśli nie można przeprowadzić konwersji , zwracane jest 0.

które jest zupełnie różne niż cplusplus.com