Можно ли отследить ошибку переполнения при умножении в си?

Вопросы по языкам программирования Си и С++.
VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Можно ли отследить ошибку переполнения при умножении в си?

Сообщение VBTerminator » 31.01.2012 (Вт) 16:41

Сабж.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 31.01.2012 (Вт) 18:16

Код: Выделить всё
#include <stdio.h>

inline bool mult(int a, int b, int *c)
  {
  *c=a*b;
 
  _asm
    {
    jo FAIL
    }

  return true;
  FAIL: return false;
  }

int main(void)
  {
  int a, b, c;
 
  while(scanf("%d %d", &a, &b) == 2)
    printf("%d - %s\n", c, mult(a,b,&c)?"Ok":"Fail");

  return 0;
  }

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Можно ли отследить ошибку переполнения при умножении в с

Сообщение FireFenix » 31.01.2012 (Вт) 18:29

Или заюзать класс SafeInt
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

NashRus
Постоялец
Постоялец
 
Сообщения: 386
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Можно ли отследить ошибку переполнения при умножении в с

Сообщение NashRus » 31.01.2012 (Вт) 22:22

Какой класс в СИ.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Можно ли отследить ошибку переполнения при умножении в с

Сообщение FireFenix » 31.01.2012 (Вт) 23:46

NashRus писал(а):Какой класс в СИ.

Может человек обобщённо назвал Си... не сказано что на чистом :)
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Можно ли отследить ошибку переполнения при умножении в с

Сообщение VBTerminator » 01.02.2012 (Ср) 15:24

Qwertiy, большое спасибо!

FireFenix писал(а):Может человек обобщённо назвал Си... не сказано что на чистом :)

Нет, именно на чистом (не c++), стандарт C99.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.02.2012 (Ср) 16:53

Не за что :)
Кстати, в Си ведь нет типа bool?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли отследить ошибку переполнения при умножении в с

Сообщение Хакер » 01.02.2012 (Ср) 23:58

VBTerminator писал(а):Qwertiy, большое спасибо!

А ничего, что код не платформонезависимый?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Можно ли отследить ошибку переполнения при умножении в с

Сообщение VBTerminator » 02.02.2012 (Чт) 6:43

А как тогда сделать?

Сейчас пришло в голову такая идея, пойдёт (необходимо перемножить два двухбайтовых беззнаковых числа)?
Код: Выделить всё
BOOL Mul( WORD var1, WORD var2 )
{
    WORD result;
    DWORD tmp;

    result = a * b;
    tmp = (DWORD)a * (DWORD)b

    if( result == tmp )
    {
        //Всё нормально
    }
    else
    {
        //Внимание: переполнение
    }
}

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.02.2012 (Чт) 12:09

Зачем умножать 2 раза?

Код: Выделить всё
#include <stdio.h>

inline int mult(unsigned short a, unsigned short b, unsigned short *c)
  {
  unsigned res = a*b;
  return (*c=res)==res;
  }

int main(void)
  {
  unsigned short a, b, c;
 
  while(scanf("%hu %hu", &a, &b) == 2)
    printf("%hu - %s\n", c, mult(a,b,&c)?"Ok":"Fail");

  return 0;
  }

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.02.2012 (Чт) 12:42

Хакер писал(а):А ничего, что код не платформонезависимый?

Поподробнее можно?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли отследить ошибку переполнения при умножении в с

Сообщение Хакер » 02.02.2012 (Чт) 12:44

Qwertiy писал(а):Поподробнее можно?

Используется x86-ассемблер.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.02.2012 (Чт) 12:46

Хакер писал(а):Используется x86-ассемблер.

Где именно он не будет работать?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли отследить ошибку переполнения при умножении в с

Сообщение Хакер » 02.02.2012 (Чт) 12:56

Хочешь от меня список аппаратных архитектур, где нет инструкции jo в значении jump-if-overflow?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.02.2012 (Чт) 13:29

Хакер писал(а):Хочешь от меня список аппаратных архитектур, где нет инструкции jo в значении jump-if-overflow?

Хочу более или менее реальный пример, где такой инструкции нет.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли отследить ошибку переполнения при умножении в с

Сообщение Хакер » 02.02.2012 (Чт) 13:44

У микропроцессоров AVR нет инструкции JO. Там аналогичная инструкция называется BRVS.

У микропроцессоров PIC нет инструкции JO. Там вообще нет условных джампов. Есть безуловный джамп — инструкция GOTO. Она может быть применена в паре со skip-инструкцией, которая проверяет определённый бит и заставляет процессор пропускать любую последующую инструкцию на основе проверки бита. Пара инструкций skip+goto даёт условный переход, хотя после skip-инструкции может стоять любая другая.

У микропроцессоров ARM нет инструкции JO. (А это практически все мобильные устройства + модемы, маршрутизаторы и т.п.) Там вообще у каждой инструкции есть битовое поле, определяющее условие, при котором инструкция будет или не будет выполнена. То есть подход такой, что инструкции ветвлений вообще не нужны. Но тем не менее, инструкции ветвления всё же есть, и аналог инструкции JOназывается BVS.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.02.2012 (Чт) 15:08

Спасибо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли отследить ошибку переполнения при умножении в с

Сообщение Хакер » 02.02.2012 (Чт) 15:36

Я бы реалиовал функцию так:
Код: Выделить всё
bool mult(...)
{
#if defined(_X86_)
    // Реализация для x86
#elif defined(_arch2_macro_)
    // Реализация для 2-ой архитектуры
#elif defined(_arch3_macro_)
    // Реализация для 3-ей архитектуры

   ....

#else
   // Универсальная реализация
#endif
}
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в С/С++

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList