2013-11-28 4 views
1

Это 16-разрядное значение без знака, которое задание вызывающего абонента присваивается при отправке сообщения. Для каждого нового сообщения значение увеличивается на единицу, в конечном итоге обертывается вокруг и образует последовательность 0,1,2, ...... 65533, 655534, 6555, 35 и т. Д. Поэтому мне нужен счетчик для поиска целей. Мне нужна помощь в создании наиболее эффективного способа обертывания. Например, если текущее значение равно 65534, а мой целевой счет равен 5, мне нужна функция для обертывания и установка целевого значения в правильное значение.Самый элегантный способ обернуть вокруг целых чисел

+0

да я сделал метод проверки над потоком, а затем вычитая цель из обертки вокруг и затем изменить новый целевое значение. Обнаружил, что это долгий путь сделать простой материал! – C0D3R

ответ

2

Если вы используете счетчик unsigned int, то вы можете просто сделать (x + 5) & 0xffffU - нет необходимости проверять переполнение, потому что арифметика в неподписанных типах определена для обхода вокруг на C, а неподписанные типы должны использовать чисто двоичное представление.

-2

Если он увеличивает только один, вы можете просто сделать следующее:

#include <limits.h> 

if (myint == (INT16_MAX - 1)) 
    counter++; 
myint++; 

Однако, «правильный» способ сделать это, который будет обнаруживать переполнение выглядит следующим образом:

#include <limits.h> 

if ((INT16_MAX - myint) < numtoadd) 
    counter++; 
myint += numtoadd; 
+2

INT16_MAX - 32767, а не 65535. –

+0

Этот ответ намного сложнее, чем нужно, поскольку OP работает с неподписанными значениями. ответ кафе лучше. –

0

Если ваш компьютер поддерживает 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); 
+1

[Этот ответ] (http://stackoverflow.com/a/19843181/2327831) говорит, что это неопределенное поведение, так как 'v' повышается до' signed int' здесь 'v + = 5;', а переполнение по подписанному - не определено. Я что-то упускаю? (Может быть, 'v = (unsigned int) v + 5u' будет правильным?) – this

+0

Если компилятор сломал это, я бы отказался использовать компилятор. Существует две возможности обсудить, предполагая, что CHAR_BIT - 8. Случай (1): 'sizeof (int) == 2'; то 65534 является «unsigned int» и определяется поведение. Случай (2): 'sizeof (int)' больше 2, поэтому 65534 + 5 не будет переполняться, поэтому преобразование обратно в 'uint16_t' безопасно. –

+0

Корпус (2): '65534 + INTMAX_MAX' будет переполняться. '+ 5' никогда не ограничивался чем-либо, поэтому он мог бы также быть max int. – this

Смежные вопросы