Использование номера флага в целых числах без знака

0

Много раз люди объединяют логическую проверку путем повторного использования переменной int они уже имеют, и проверки для -1 если что-то существует или нет.

Однако, что, если кто-то хочет использовать целые числа без знака, но все же хочет использовать этот метод, а также где 0 фактически имеет другое значение, кроме существования.

Есть ли способ, чтобы диапазон данных был -1 до 4 294 967 294?

Очевидным выбором здесь является просто использовать bool который определяет, что вам нужно, но я понимаю, что bool является байтом и может действительно добавить размер хранилища, если у вас есть массив структур. Вот почему я задавался вопросом, есть ли способ получить самые полезные номера, которые вы можете (посты), оставив только один номер, чтобы действовать как флаг.

Infact, если можно сделать что-то вроде сдвига диапазона данных типа данных, похоже, что он переместит его на нечто вроде -1 от 0 до 4,294,967,285, что позволит вам иметь 10 булевых флагов без дополнительных затрат (бит).

Очевидный хакерский метод заключается в том, чтобы просто добавить любое количество к тому, что ваше хранилище, и запомнить его позже, но я хотел бы сохранить его немного читабельнее (думаю, если бы это было так, я бы даже не использовал -1 но meh).

  • 1
    Как насчет использования uint32_t , используйте диапазон от 0 до 4 294 967 294, а затем 4,294,967,295 - это флаг. Чем бы ни был флаг (-1, 4 294 967 295 или что-то еще), он должен быть выражен как макрос или константа. if (i == SpecialFlag) DoDifferentCode();
Теги:

2 ответа

1
Лучший ответ

Если вы просто хотите выбрать значение, которое не может существовать в вашей интерпретации переменной, и использовать ее для указания исключения или значения ошибки, почему бы просто не сделать это? Вы можете взять такое значение, определить его как макрос и использовать его. Например, если вы уверены, что ваша переменная никогда не достигает максимального предела, поставьте:

#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 означает, что-то большее, чем 0, и не существует. Так что нет, (по принципу голубины, я думаю) это невозможно.

И не должно быть. Перегрузка переменной - это плохая практика, если вы не отстаете от своих последних 3 байтов от ОЗУ, которых вы почти наверняка не знаете. Поэтому да, пожалуйста, используйте другую переменную с правильным именем и понятной целью.

  • 0
    Я согласен с вами, что это плохая практика. Больше было вопроса / любопытства, был ли способ присвоить псевдониму тип данных или определить свой собственный с настраиваемым диапазоном. Приложение, которое я рассматривал, могло бы быть там, где каждый маленький байт имеет значение, например, 1 000 000 000 объектов, в которых этот 1 байт имеет большое значение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню