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

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

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

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


a = -5;
b = 1;

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

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

гы

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

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

гы

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

(круглый)

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

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

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


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