Как проверить на переполнение целого числа со знаком в C без неопределенного поведения?

Получить все элементы div, которые имеют класс dog, и построить массив из них.

Затем используйте метод every массива, чтобы проверить состояние фона. Если это верно для всех из них, выполните свой код

const dogs = Array.from(document.querySelector('div.dog'));
if (dogs.every(d => d.style.backgroundColor === 'red')) {
  console.log('do some code');
}
<div class="dog" style="background-color:red">DOG 1</div>
<div class="dog" style="background-color:red">DOG 2</div>

26
задан iBug 4 February 2019 в 06:41
поделиться

3 ответа

В действительности вы можете проверять переполнение только с unsigned целыми и арифметическими числами:

unsigned a,b,c;
a = b + c;
if (a < b) {
    /* overflow */
}

Поведение переполнения со знаком целых чисел не определено в C, но на большинстве машин вы можете использовать

int a,b,c;
a = b + c;
if (c < 0 ? a > b : a < b) {
    /* overflow */
}

Это не сработает на машинах, которые используют какую-либо насыщающую арифметику

6
ответ дан Chris Dodd 28 November 2019 в 06:40
поделиться

Целочисленное переполнение является каноническим примером «неопределенного поведения» в C (с учетом того, что операции с целыми числами без знака никогда не переполняются, вместо этого они определены для циклического перехода) . Это означает, что после того, как вы выполнили x + y , если он переполнился, вы уже попали в шланг. Слишком поздно делать какие-либо проверки - ваша программа уже могла дать сбой. Думайте об этом как о проверке деления на ноль - если вы дождетесь, пока деление не будет выполнено, чтобы проверить, будет уже слишком поздно.

Таким образом, это означает, что метод (1) - единственный правильный способ сделать это. Для max вы можете использовать INT_MAX из .

Если x и / или y могут быть отрицательными, тогда все сложнее - вам нужно провести тест таким образом, чтобы сам тест не мог вызвать переполнение.

if ((y > 0 && x > INT_MAX - y) ||
    (y < 0 && x < INT_MIN - y))
{
    /* Oh no, overflow */
}
else
{
    sum = x + y;
}
60
ответ дан 28 November 2019 в 06:40
поделиться

Вам нужно только проверить один из них. Если x + y переполняется, оно будет меньше, чем x и y. Следовательно:

int sum = x + y;
if (sum < x) error;

должно быть достаточно.

На следующем сайте есть много информации о целочисленном переполнении:

http://www.fefe.de/intof.html

Если вы хотите обрабатывать отрицательные числа, его можно расширить:

int sum = x + y;
if (y >= 0) {
   if (sum < x) error;
} else {
   if (sum > x) error;
}
-5
ответ дан 28 November 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: