Обработка переполнения, когда кастинг удваивается до целых чисел в C

Вы можете очистить внутренний цикл, посмотрев на каждую клавишу и передав только значение. Также я предлагаю вытащить Object.keys(person).length из цикла for, потому что он будет обрабатывать ключи каждого цикла. Если вы помещаете их в переменную и указываете, что это позволяет избежать переоценки ключей.

    var groups = Object.keys(testData);
    for(var i = 0; i<groups.length; i++){
        var group = testData[groups[i]];
        for(var j = 0; j<group.length; j++){
            var personEntry = group[j];
            var person_id = Object.keys(personEntry)[0];
            console.log(person_id);
            var personEntries = personEntry[person_id];
            for(var k = 0; k<personEntries.length; k++){
                var personValues = Object.values(personEntries[k]);
                for(var l = 0; l<personValues.length; l++){
                    console.log(personValues[l]);
                }
            }
        }
    }
25
задан nwellnhof 8 April 2016 в 23:47
поделиться

6 ответов

limits.h имеет константы для макс. и минута возможных значений для целочисленных типов данных, можно проверить двойную переменную перед кастингом, как

if (my_double > nextafter(INT_MAX, 0) || my_double < nextafter(INT_MIN, 0))
    printf("Overflow!");
else
    my_int = (int)my_double;

РЕДАКТИРОВАНИЕ: nextafter() решит проблему, упомянутую nwellnhof

12
ответ дан qrdl 28 November 2019 в 20:54
поделиться

Отвечать на Ваш вопрос: поведение, когда Вы бросаете из плаваний диапазона, не определено или конкретная реализация.

Разговор на основе опыта: я работал над системой MIPS64, которая не сделала реализовал подобные броски вообще. Вместо того, чтобы делать что-то детерминированное ЦП выдал исключение ЦП. Обработчик исключений, который должен эмулировать бросок, возвращенный, ничего не делая к результату.

я закончил со случайными целыми числами. Угадайте, сколько времени это взяло для прослеживания ошибки до этой причины. :-)

Вы лучше сделаете проверку принадлежности к диапазону сами, если Вы не будете уверены, что число не может выйти из допустимого диапазона.

11
ответ дан Nils Pipenbrinck 28 November 2019 в 20:54
поделиться

Портативный путь к C++ состоит в том, чтобы использовать класс SafeInt:

http://www.codeplex.com/SafeInt

реализация будет допускать нормальное дополнение/вычитать/и т.д. на типе числа C++ включая броски. Это выдаст исключение каждый раз, когда и переполняются, сценарий обнаруживается.

SafeInt<int> s1 = INT_MAX;
SafeInt<int> s2 = 42;
SafeInt<int> s3 = s1 + s2;  // throws

я высоко советую использовать этот класс в любом месте, где переполнение является важным сценарием. Это делает очень трудным постараться не тихо переполняться. В случаи, где существует сценарий восстановления для переполнения, просто поймайте SafeIntException и восстановитесь как соответствующие.

SafeInt теперь работает над GCC, а также Visual Studio

4
ответ дан JaredPar 28 November 2019 в 20:54
поделиться

Другая опция состоит в том, чтобы использовать повышение:: numeric_cast, который допускает произвольное преобразование между числовыми типами. Это обнаруживает потерю диапазона, когда числовой тип преобразовывается и выдает исключение, если диапазон не может быть сохранен.

веб-сайт, на который ссылаются выше также, обеспечивает небольшой пример, который должен дать быстрый обзор того, как этот шаблон может использоваться.

, Конечно, это больше не плоскость C ;-)

2
ответ дан Jan Hudec 28 November 2019 в 20:54
поделиться

Я не могу сказать Вам наверняка, определяется ли это для всех платформ, но это в значительной степени, что произошло на каждой платформе, которую я использовал. Кроме, по моему опыту, это прокручивается. Таким образом, если значение двойного является INT_MAX + 2, то, когда результат броска заканчивает тем, что был INT_MIN + 2.

Что касается лучшего способа обработать его, я действительно не уверен. Я столкнулся с проблемой сам и должен все же найти изящный способ иметь дело с нею. Я уверен, что кто-то ответит, что может помочь нам обоим там.

-1
ответ дан Jeff Barger 28 November 2019 в 20:54
поделиться

Я не уверен в этом, но я думаю, что может быть возможно "включить" исключения в операции с плавающей запятой для под/переполнять... смотрят на этот Контакт за Исключениями С плавающей точкой в MSVC7\8, таким образом, у Вас могла бы быть альтернатива если/еще проверки.

0
ответ дан Autodidact 28 November 2019 в 20:54
поделиться