Вероятно, вы переходите в переполнение всякий раз, когда пересекаете ULONG_MAX
. Используйте больший тип данных, такой как unsigned long long
. Однако, если ваше число может быть больше, чем максимальное, которое может содержать этот тип, вы, вероятно, пытаетесь реализовать библиотеку bignum.
Следуя совету cube , ванильный код C:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
uint64_t binToDec(const char * s){
uint64_t res = 0; size_t i, n;
for (i = 0, n = strlen(s) - 1; i < n; ++i) {
res = (res | (unsigned int)(s[ i ] - '0')) << 1;
}
return res;
}
int main() {
/* Note the special C99 format specifier macros defined in <inttypes.h> */
printf("%"PRIu64"\n",
binToDec("11100101001001000000100000100100110100110011010001111111"));
}
Примечание: ISO C ++ не поддерживает long long
.