>>В последнее время стало появляться много сообщений об обнаружении в разных программах >>ошибок, связанных с целочисленным переполнением. >>Допустим у нас есть код, где одна переменная время от времени увеличивается >>на некоторое заранее неизвестное значение. Например так: >> >>unsigned int counter; >> >>void accounting( unsigned int delta ) >>{ >> counter = counter + delta; >>} >> >>В определенный момент может быть достигнуто такое состояние, когда после прибавления очередной >>дельты у нас будет переполнение. Я придумал такой путь решения проблемы: >> >>void accounting2( unsigned int delta ) >>{ >> if( counter < (counter + delta) ) >> { >> counter = counter + delta; >> } >> else >> { >> printf("Overflow detected\n"); >> } >>} >> >>Однако этот способ аппаратно зависимый и не лишен недостатков: он не будет >>работать, если при переполнении не происходит циклического перехода в регистре. (т.е. >>допустим у нас есть восьмиразрядный регистр А, содержащий число 0xFE. Если >>добавить к нему 0x1, то мы получим 0xFF, а если добавить >>0x3, то мы получим переполнение, и в регистре у нас будет >>0x1. По крайней мере это характерно для платформы ИНТЕЛ) >> >>Вопрос: как правильно отслеживать факт целочисленного переполнения? > if ( counter > ~delta ) fprintf( stderr, "Overflow!!!\n" );
|