Много раз люди объединяют логическую проверку путем повторного использования переменной int
они уже имеют, и проверки для -1
если что-то существует или нет.
Однако, что, если кто-то хочет использовать целые числа без знака, но все же хочет использовать этот метод, а также где 0
фактически имеет другое значение, кроме существования.
Есть ли способ, чтобы диапазон данных был -1 до 4 294 967 294?
Очевидным выбором здесь является просто использовать bool
который определяет, что вам нужно, но я понимаю, что bool
является байтом и может действительно добавить размер хранилища, если у вас есть массив структур. Вот почему я задавался вопросом, есть ли способ получить самые полезные номера, которые вы можете (посты), оставив только один номер, чтобы действовать как флаг.
Infact, если можно сделать что-то вроде сдвига диапазона данных типа данных, похоже, что он переместит его на нечто вроде -1 от 0 до 4,294,967,285, что позволит вам иметь 10 булевых флагов без дополнительных затрат (бит).
Очевидный хакерский метод заключается в том, чтобы просто добавить любое количество к тому, что ваше хранилище, и запомнить его позже, но я хотел бы сохранить его немного читабельнее (думаю, если бы это было так, я бы даже не использовал -1 но meh).
Если вы просто хотите выбрать значение, которое не может существовать в вашей интерпретации переменной, и использовать ее для указания исключения или значения ошибки, почему бы просто не сделать это? Вы можете взять такое значение, определить его как макрос и использовать его. Например, если вы уверены, что ваша переменная никогда не достигает максимального предела, поставьте:
#define MY_FUN_ERROR_VALUE (UINT_MAX)
то вы можете использовать его как:
unsigned r = my_function_maybe_returning_error();
if (r == MY_FUN_ERROR_VALUE) {handle error}
вы также должны убедиться, что my_function_maybe_returning_error
не возвращает MY_FUN_ERROR_VALUE в обычных условиях, когда на самом деле ошибка не возникает. Для этого вы можете использовать assert
:
unsigned my_function_maybe_returning_error() {
...
// branch going to return normal (not error) value r
assert(r != MY_FUN_ERROR_VALUE);
return(r);
}
Я не вижу в этом ничего плохого.
Вы просто спросили, как использовать значение, которое может быть 0 или что-то большее, чем 0, чтобы удерживать три состояния: независимо от 0 означает, что-то большее, чем 0, и не существует. Так что нет, (по принципу голубины, я думаю) это невозможно.
И не должно быть. Перегрузка переменной - это плохая практика, если вы не отстаете от своих последних 3 байтов от ОЗУ, которых вы почти наверняка не знаете. Поэтому да, пожалуйста, используйте другую переменную с правильным именем и понятной целью.
uint32_t
, используйте диапазон от 0 до 4 294 967 294, а затем4,294,967,295
- это флаг. Чем бы ни был флаг (-1, 4 294 967 295 или что-то еще), он должен быть выражен как макрос или константа.if (i == SpecialFlag) DoDifferentCode();