Это 16-разрядное значение без знака, которое задание вызывающего абонента присваивается при отправке сообщения. Для каждого нового сообщения значение увеличивается на единицу, в конечном итоге обертывается вокруг и образует последовательность 0,1,2, ...... 65533, 655534, 6555, 35 и т. Д. Поэтому мне нужен счетчик для поиска целей. Мне нужна помощь в создании наиболее эффективного способа обертывания. Например, если текущее значение равно 65534, а мой целевой счет равен 5, мне нужна функция для обертывания и установка целевого значения в правильное значение.Самый элегантный способ обернуть вокруг целых чисел
ответ
Если вы используете счетчик unsigned int
, то вы можете просто сделать (x + 5) & 0xffffU
- нет необходимости проверять переполнение, потому что арифметика в неподписанных типах определена для обхода вокруг на C, а неподписанные типы должны использовать чисто двоичное представление.
Если он увеличивает только один, вы можете просто сделать следующее:
#include <limits.h>
if (myint == (INT16_MAX - 1))
counter++;
myint++;
Однако, «правильный» способ сделать это, который будет обнаруживать переполнение выглядит следующим образом:
#include <limits.h>
if ((INT16_MAX - myint) < numtoadd)
counter++;
myint += numtoadd;
INT16_MAX - 32767, а не 65535. –
Этот ответ намного сложнее, чем нужно, поскольку OP работает с неподписанными значениями. ответ кафе лучше. –
Если ваш компьютер поддерживает uint16_t
(определен в <stdint.h>
в компиляторах C99 и C11), используйте его.
uint16_t v = 65534;
v += 5;
assert(v == 3);
Если ваш компьютер не поддерживает uint16_t
, то вы можете использовать:
unsigned int v = 65534;
v = (v + 5) & 0xFFFF;
assert(v == 3);
[Этот ответ] (http://stackoverflow.com/a/19843181/2327831) говорит, что это неопределенное поведение, так как 'v' повышается до' signed int' здесь 'v + = 5;', а переполнение по подписанному - не определено. Я что-то упускаю? (Может быть, 'v = (unsigned int) v + 5u' будет правильным?) – this
Если компилятор сломал это, я бы отказался использовать компилятор. Существует две возможности обсудить, предполагая, что CHAR_BIT - 8. Случай (1): 'sizeof (int) == 2'; то 65534 является «unsigned int» и определяется поведение. Случай (2): 'sizeof (int)' больше 2, поэтому 65534 + 5 не будет переполняться, поэтому преобразование обратно в 'uint16_t' безопасно. –
Корпус (2): '65534 + INTMAX_MAX' будет переполняться. '+ 5' никогда не ограничивался чем-либо, поэтому он мог бы также быть max int. – this
- 1. Самый элегантный способ генерации простых чисел
- 2. Самый элегантный способ подсчета чисел в списке
- 3. Самый простой способ хеш-набора целых чисел?
- 4. Самый эффективный способ хранения списка целых чисел
- 5. Самый эффективный способ подытожить массив целых чисел
- 6. Самый быстрый способ ввода целых чисел
- 7. Самый элегантный способ обернуть обратные вызовы freeglut внутри класса
- 8. Элегантный способ создания двух разных случайных целых чисел
- 9. Самый элегантный способ включения AngularJS
- 10. Самый элегантный способ закрепить линию?
- 11. Каков самый быстрый способ получить частоты целых чисел в векторе?
- 12. Java самый быстрый способ конкатенации строк, целых чисел и поплавков
- 13. Самый эффективный способ вставки нескольких строк целых чисел
- 14. Самый эффективный способ заполнить представление выбора с помощью целых чисел?
- 15. C - самый быстрый способ чтения больших количеств целых чисел?
- 16. Самый быстрый способ читать миллионы целых чисел от stdin C++?
- 17. Самый эффективный способ преобразования целых чисел pandas в строки?
- 18. Самый быстрый способ генерации перестановки массива целых чисел
- 19. Каков самый быстрый способ сортировки массива из 7 целых чисел?
- 20. Каков самый быстрый способ фильтрации таблицы целых чисел в Python?
- 21. Более элегантный способ достижения полей вокруг UITableView?
- 22. Эффективный способ чтения целых чисел из файла
- 23. Правильный способ сравнения целых чисел
- 24. Самый элегантный способ получить какой-то элемент?
- 25. Самый элегантный способ фильтрации массива другим массивом
- 26. Самый элегантный способ реализации анимированных «скользящих панелей»
- 27. Какой самый элегантный способ превратить хэш изнутри?
- 28. Самый элегантный способ получить этот полиморфизм Проблема
- 29. Самый элегантный способ установить ComboBox по значению
- 30. Самый элегантный способ написания слоя абстракции
да я сделал метод проверки над потоком, а затем вычитая цель из обертки вокруг и затем изменить новый целевое значение. Обнаружил, что это долгий путь сделать простой материал! – C0D3R