целочисленное переполнение в выражении [-Woverflow] - TinyCircuit

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

это фрагмент кода, в котором, похоже, происходит ошибка.

#define  ADV_INTERVAL_MIN_MS  50
#define  ADV_INTERVAL_MAX_MS  100

void setConnectable(void)
{
  tBleStatus ret;

  const char local_name[] = {AD_TYPE_COMPLETE_LOCAL_NAME, 'B', 'l', 'u', 'e', 'N', 'R', 'G'};

  hci_le_set_scan_resp_data(0, NULL);
  PRINTF("General Discoverable Mode.\n");

  ret = aci_gap_set_discoverable(ADV_IND,
                                 (ADV_INTERVAL_MIN_MS * 1000) / 625, (ADV_INTERVAL_MAX_MS * 1000) / 625,
                                 STATIC_RANDOM_ADDR, NO_WHITE_LIST_USE,
                                 sizeof(local_name), local_name, 0, NULL, 0, 0);

  if (ret != BLE_STATUS_SUCCESS)
    PRINTF("%d\n", (uint8_t)ret);

}

, 👍1

Обсуждение

Что такое ADV_INTERVAL_MIN_MS?, @Majenko

50 * 1000 > 32768. 100 * 1000 > 32768. Это *не должно* иметь значения, но лучше сделать его длинным, добавив L к вашим определенным числам., @Majenko


1 ответ


1

Вы можете указать тип числа, используя такие суффиксы, как L, LL, UL и тому подобное. Если вы не укажете тип таким образом, все целые числа, достаточно малы, чтобы поместиться в int, будут иметь тип int. Когда ты написать

ADV_INTERVAL_MIN_MS * 1000

препроцессор расширяет его до

50 * 1000

Поскольку оба аргумента имеют тип int, компилятор будет использовать этот тип чтобы вычислить результат. Однако результат 50 000, а на 16-битном системах наибольшее число, которое может поместиться в int, равно 32 767, таким образом, переполнение.

Как предложил Маженко, простое решение — добавить суффикс L. (для long) к любому операнду. Затем компилятор выполнит арифметические операции с использованием типа данных long.

,

Извините, хм, что вы имеете в виду под операндом? Я немного новичок в этом., @Joel Wong

Операнды 50 и 1000. Добавьте суффикс «L» к одному из них (или к обоим)., @Edgar Bonet