Какой эффективный способ избежать целочисленного переполнения преобразования беззнаковых int в int в C ++? - PullRequest
3 голосов
/ 02 марта 2011

Это следующий эффективный и беспроблемный способ преобразования беззнакового int в int в C ++:

#include <limits.h>
void safeConvert(unsigned int passed) 
{
    int variable = static_cast<int>(passed % (INT_MAX+1)); 
    ...
}

Или есть способ получше?

UPDATE

Как указал Джеймс МакНеллис, не является неопределенным присваивать целое число без знака int> INT_MAX - скорее это определяется реализацией. Таким образом, контекст здесь теперь специально для меня, чтобы убедиться, что это целое число сбрасывается в ноль, когда беззнаковое целое превышает INT_MAX.

Исходный контекст

У меня есть несколько целых чисел без знака, используемых в качестве счетчиков, но я хочу передать их как целые числа в конкретном случае.

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

Ответы [ 2 ]

7 голосов
/ 02 марта 2011

Это также должно работать:

int variable = passed & INT_MAX;
0 голосов
/ 02 марта 2011

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

Эффективное преобразование во что?Если все общие значения для int и unsigned int соответствуют, и вы хотите, чтобы другие беззнаковые значения, такие как INT_MAX + 1, имели разные значения, то вы можете сопоставить их только с отрицательными целочисленными значениями.Это делается по умолчанию и может быть явно запрошено с помощью static_cast<int>(my_unsigned).В противном случае вы можете отобразить их все на 0, или -1, или INT_MIN, или выбросить старший бит ... проще всего просто: if (my_unsigned > INT_MAX) my_unsigned = XXX или ...my_unsigned &= INT_MAX, чтобы очистить старший бит.Но будут ли вызванные функции работать правильно, если переполнится int?Возможно, лучшим решением было бы использовать 64-битные целочисленные значения для начала?

...