Por que (18446744073709551615 == -1) é verdade?

Quando eu estava trabalhandostring::npos Percebi algo e não consegui encontrar nenhuma explicação para isso na web.

(string::npos == ULONG_MAX)

e

(string::npos == -1)

são verdadeiras.

Então eu tentei isso:

(18446744073709551615 == -1)

o que também é verdade.

Como isso pode ser possível? É por causa de uma conversa binária?

questionAnswers(4)

yourAnswerToTheQuestion