unsigned long
на вашей цели, скорее всего, 32-битное значение.2 32 = 4294967296, поэтому, очевидно, сравнение с 10000000000000, например, всегда будет иметь значение false.
Если ваш компилятор не выдавал никаких предупреждений, вам следует посмотреть настройки вашего компилятора.
Измените тип creditCard
на unsigned long long
или лучше uint64_t
(объявлено в <stdint.h>
).Затем вы должны также указать литеральное целое число с суффиксом ULL
, например:
creditCard >= 100000000000000ULL
Однако реализация имеет серьезные недостатки.Вы получаете номер карты как целое число, а затем конвертируете его в строку.Поскольку ваш тип данных не будет содержать номер кредитной карты, строка и целое число будут неправильными.Номера кредитных карт не являются арифметическими объектами, и хранение в виде целого числа является плохой идеей по ряду причин, по которым просто диапазон - даже uint64_t
хорош только для 19 цифр - что может быть достаточно на данный момент, но, возможно, не в будущем.Номер должен быть получен и обработан как строка.Преимущества состоят в том, что вы можете выполнить более сложную проверку, разрешить пробелы в группировке цифр и не потерять первые нулевые цифры.
Сравнение строк на нормализованных строках цифр (т. Е. С удаленными пробелами) будет работать так же, как и арифметическое сравнение,Например:
if( strcmp( cardNumberString, "10000000000" ) >= 0 )
достигает того же результата, что и:
if( cardNumberUnsLongLong >= 10000000000ULL )