Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проверка на переполнение типа / 15 сообщений из 15, страница 1 из 1
26.09.2006, 11:24
    #34012002
Sandro_K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
Код: plaintext
1.
2.
3.
int a, b, c;
c = a + b;
c = a - b;

Можно ли каким-нибудь способом проверить, вызовит ли операция переполнение типов, не переходя при этом к типу с большей емкостью?
...
Рейтинг: 0 / 0
26.09.2006, 12:57
    #34012365
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
Аналитически. Например, при сложении, вычитаешь из максимального значения a, а потом стравниваешь его с b. Если b оказалось больше, то будет переполнение.
...
Рейтинг: 0 / 0
26.09.2006, 14:13
    #34012735
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
Sandro_KМожно ли каким-нибудь способом проверить, вызовит ли операция переполнение типов, не переходя при этом к типу с большей емкостью?

можно попытаться заюзать азм. после операций обрабатывать флаг переноса...

(круглый)
...
Рейтинг: 0 / 0
26.09.2006, 15:09
    #34012958
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
Код: plaintext
if( a+b<b || a+b<a )
...
Рейтинг: 0 / 0
26.09.2006, 15:34
    #34013046
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
Aklin
Код: plaintext
if( a+b<b || a+b<a )


a = -5;
b = 1;

переполнения НЕ будет... Ваш пример отработает на ура...

(круглый)
...
Рейтинг: 0 / 0
26.09.2006, 15:45
    #34013090
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
извратился:
Код: plaintext
if( *( DWORD* )&a + *( DWORD* )&b < ( *( DWORD* )&b > *( DWORD* )&a )? *( DWORD* )&b: *( DWORD* )&a ){/*...*/}
...
Рейтинг: 0 / 0
26.09.2006, 15:53
    #34013120
LeonM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
error handling
...
Рейтинг: 0 / 0
26.09.2006, 16:00
    #34013156
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
Aklinизвратился:...

гы

началось в колхозе утро...
а может просто ансигнет инт ? ик...

(круглый)
...
Рейтинг: 0 / 0
26.09.2006, 16:04
    #34013182
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
Код: plaintext
if( i+j < ( ( i < j )? i:j ) )
...
Рейтинг: 0 / 0
26.09.2006, 16:27
    #34013279
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
kolobok0 Aklinизвратился:...

гы

началось в колхозе утро...
а может просто ансигнет инт ? ик...

(круглый)

Тады уж long
...
Рейтинг: 0 / 0
26.09.2006, 16:30
    #34013294
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
AkhТады уж long

нее..имелось ввиду не размер на битик больше..а уход от двоякости, чтоб однозначно иф работал...правда думаю придёться отрицательные обрабатывать ручками тодысь...

(круглый)
...
Рейтинг: 0 / 0
26.09.2006, 16:35
    #34013320
Sandro_K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
Я сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
#include <limits>

template<typename T>
bool CanAdd(const T& a, const T& b)
{
	return b <= (std::numeric_limits<T>::max() - a);
}

template<typename T>
bool CanSub(const T& a, const T& b)
{
	return b <= (std::numeric_limits<T>::min() + a);
}

template<typename T>
bool CanMul(const T& a, const T& b)
{
	return (b <= (std::numeric_limits<T>::max() / a)) && 	
	       (b >= (std::numeric_limits<T>::min() / a));
}

template<typename T>
bool CanDiv(const T& a, const T& b)
{
	return (a <= (std::numeric_limits<T>::max() * b)) && 
	       (a >= (std::numeric_limits<T>::min() * b));
}
...
Рейтинг: 0 / 0
26.09.2006, 16:49
    #34013400
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
я смеялся, насколько я умный:
Код: plaintext
1.
inline int isAddOv(short a, short b){ return ( (short) ( (a=(a< 0 )?-a:a) + (b=(b< 0 )?-b:b) ) < (short)( ( a<b )?a:b ) ); }

единственное: делайте копии!!!
...
Рейтинг: 0 / 0
26.09.2006, 16:50
    #34013401
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
Sandro_KЯ сделал так:
[src c++]
#include <limits>

template<typename T>
bool CanAdd(const T& a, const T& b)
{
return b <= (std::numeric_limits<T>::max() - a);
}

...


О! Мой вариант. :)
...
Рейтинг: 0 / 0
26.09.2006, 17:11
    #34013523
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на переполнение типа
вот это уж точно должно работать:
Код: plaintext
( ( (a>> 15 )!=(b>> 15 ) )? 0 :( (a> 0 )?((short)(a+b)< 0 ):((short)(a+b)> 0 ) ) )
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проверка на переполнение типа / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]