Ограничить разрядную позицию двух переменных перед арифметикой для предотвращения переполнения целых чисел


0

Прежде всего, я даже не думаю, что эта функция верна:

false

Он возвращается, falseкогда умножение будет переполняться, но оно также возвращается, 0x10000когда умножение не переполняется. Например, если заданы a = 0x8000и b = false, эта функция возвращается, 0x80000000хотя результат a * b 0x1ffffсоответствует 32 битам. Но если изменить а и Ь к 0xffffи addition_is_safe(которые имеют ту же самую «высокую один битую позицию») , то умножьте на самом деле делает переполнение. Но вы не могли сказать, просто используя самую высокую позицию бит. Вам нужно будет посмотреть больше, чем просто верхний бит, чтобы выяснить, будет ли переполнение переполняться. Фактически, вам нужно будет сделать часть или все фактическое умножение, чтобы выяснить правильный ответ.

Аналогичным образом, вы можете построить функцию, addition_is_safeкоторая обнаруживает «возможные переполнения» (как в положительном, так и в отрицательном направлении) с использованием битовых позиций. Но вы не можете обнаружить «фактическое переполнение», если вы не выполняете часть или все фактическое дополнение.

Я считаю, что в худшем случае вы будете вынуждены делать все возможное умножение или добавление, поэтому я не уверен, что вы ничего сохраните, не давая машине просто сделать полное умножение / дополнение для вас.


0

Математически, если вы добавите два числа, у вас будет самое большее перенос 1 в место, не превышающее самого длинного.

Это абсолютно правильно (для беззнаковых двоичных чисел) без исключения; вы просто заблудились в своем дальнейшем рассмотрении. Таким образом, условие addition_is_safe, основанное на числах счислений бит: наибольшее количество бит слагаемых должно быть меньше, чем доступное количество бит.

bool addition_is_safe(uint32_t a, uint32_t b)
{
    size_t a_bits=highestOneBitPosition(a), b_bits=highestOneBitPosition(b);
    return (a_bits<b_bits?b_bits:a_bits)<32;
}

Конечно, вы знаете, что falseвозврат из этой функции не всегда означает, что произойдет переполнение, но trueвозврат означает, что переполнение не может произойти.


-1

вы можете проверить переполнение от добавления двух положительных целых чисел с помощью (a + b) < a || (a + b) < b

overflow либо сделает значение отрицательным (для целых чисел со знаком), либо оставит меньший положительный режим 32 остатка (для unsigned)

положительное добавление к отрицательному никогда не будет переполняться

два негатива должны быть похожи на два положительных

с, целое число, переполнение,

c,integer-overflow,

0

Ответов: 3


0

Прежде всего, я даже не думаю, что эта функция верна:

false

Он возвращается, falseкогда умножение будет переполняться, но оно также возвращается, 0x10000когда умножение не переполняется. Например, если заданы a = 0x8000и b = false, эта функция возвращается, 0x80000000хотя результат a * b 0x1ffffсоответствует 32 битам. Но если изменить а и Ь к 0xffffи addition_is_safe(которые имеют ту же самую «высокую один битую позицию») , то умножьте на самом деле делает переполнение. Но вы не могли сказать, просто используя самую высокую позицию бит. Вам нужно будет посмотреть больше, чем просто верхний бит, чтобы выяснить, будет ли переполнение переполняться. Фактически, вам нужно будет сделать часть или все фактическое умножение, чтобы выяснить правильный ответ.

Аналогичным образом, вы можете построить функцию, addition_is_safeкоторая обнаруживает «возможные переполнения» (как в положительном, так и в отрицательном направлении) с использованием битовых позиций. Но вы не можете обнаружить «фактическое переполнение», если вы не выполняете часть или все фактическое дополнение.

Я считаю, что в худшем случае вы будете вынуждены делать все возможное умножение или добавление, поэтому я не уверен, что вы ничего сохраните, не давая машине просто сделать полное умножение / дополнение для вас.


0

Математически, если вы добавите два числа, у вас будет самое большее перенос 1 в место, не превышающее самого длинного.

Это абсолютно правильно (для беззнаковых двоичных чисел) без исключения; вы просто заблудились в своем дальнейшем рассмотрении. Таким образом, условие addition_is_safe, основанное на числах счислений бит: наибольшее количество бит слагаемых должно быть меньше, чем доступное количество бит.

bool addition_is_safe(uint32_t a, uint32_t b)
{
    size_t a_bits=highestOneBitPosition(a), b_bits=highestOneBitPosition(b);
    return (a_bits<b_bits?b_bits:a_bits)<32;
}

Конечно, вы знаете, что falseвозврат из этой функции не всегда означает, что произойдет переполнение, но trueвозврат означает, что переполнение не может произойти.


-1

вы можете проверить переполнение от добавления двух положительных целых чисел с помощью (a + b) < a || (a + b) < b

overflow либо сделает значение отрицательным (для целых чисел со знаком), либо оставит меньший положительный режим 32 остатка (для unsigned)

положительное добавление к отрицательному никогда не будет переполняться

два негатива должны быть похожи на два положительных

с, целое число, переполнение,
Похожие вопросы