![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Составить программу которая проверяла бы не приводит ли суммирование двух целых чисел A и B к переполнению(т.е. к результату большему, чем 32767). Если будет переполнение, то сообщить об этом, иначе вывести сумму этих чисел. Напишите пожалуйста программу полностью. Заранее спасибо!!!!
|
|
#2
|
||||
|
||||
|
var
x,y: Integer; begin if x+y>32767 then ShowMessage('Ошибка') else ShowMessage(IntToStr(x+y)) end; Запихнеш в процедуру и всё |
|
#3
|
||||
|
||||
|
1. В дельфи Integer уже давно в диапазоне -2147483648..2147483647
2. Надо еще обрабатывать ситуацию с отрицательным числом. а посему надо наверное так: Код:
var
x,y: Integer;
begin
if (x+y>High(Integer)) or (x+y<Low(Integer)) then
ShowMessage('Ошибка')
else
ShowMessage(IntToStr(x+y))
end; |
|
#4
|
||||
|
||||
|
Цитата:
Этот код нерабочий. Т.к при попытке сложить x+y сумма записывается опять в Integer, а то что не влезло - обрезается. Поэтому данное условие всегда будет возвращать False; Необходимо вручную преобразовывать один из арументов в Int64 тогда и сумма будет Int64 Код:
if (Int64(x)+y>High(Integer)) or (Int64(x)+y<Low(Integer)) then
ShowMessage('Ошибка')
else
ShowMessage(IntToStr(x+y)) |
|
#5
|
||||
|
||||
|
Да с приведением суммы я чего-то не предусмотрел. Тут вы правы.
|
|
#6
|
|||
|
|||
|
Код:
Try
X:= A + B;
ShowMessage(IntToStr(X));
Except
ShowMessage('Overflow');
end; |
|
#7
|
||||
|
||||
|
Цитата:
Как уже говорилось, нужно использовать Int64: Код:
procedure TForm1.Button1Click(Sender: TObject);
var
x: Int64;
A, B: Integer;
begin
X:= A + B;
if ABS(x) > MaxInt then ShowMessage('Overflow') else ShowMessage('Ok');
end; |
|
#8
|
||||
|
||||
|
Еще можно проверять по такому же принципу, как проверяет процессор:
Код:
z:=x+y;
if ( (x>0) and (y>0) and (z<0) ) or ( (x<0) and (y<0) and (z>0) )then
ShowMessage('Overflow')
else
ShowMessage(IntToStr(z)); |
|
#9
|
||||
|
||||
|
Господа!
Вы забыли про такой 2-х байтовый Integer как SmallInt ![]() Тогда вся задача решается следующим образом: Код:
var
D1,D2,D3:SmallInt;
begin
D1:=32767;
D2:=0;
D3:=D1+D2;
if D3<0 then
begin
ShowMessage('Overflow');
Exit;
end;
ShowMessage(IntToStr(D3));
end; |
|
#10
|
||||
|
||||
|
Цитата:
Кстати вот для беззнаковых: Код:
z:=x+y;
if (z<x) or (z<y) then
ShowMessage('Overflow')
else
ShowMessage(IntToStr(z)); |