Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.09;
Скачать: CL | DM;

Вниз

глюки при умножении   Найти похожие ветки 

 
Gydvin ©   (2009-06-08 21:21) [0]

Доброе время суток
Вот собсно локализованный код при выполнении которого происходят странные вещи.

Возвращаемый результат функции "DDD" при некoторых задаваемых параметрах - меньше нуля O_o. Хотя если задать 17200 считает правильно. Мне нужно задавать размер TStream. А получается такая бадяга. Из-за чего это происходит и как с этим бороться.

Проверял на двух разных машинах. тоже самое

procedure TForm1.Button2Click(Sender: TObject);

 function ddd(value: integer): integer;
 begin
   result := (value * 4) * (value * 4);
 end;

begin

 caption := inttostr(ddd(14200));
end;


 
Gydvin ©   (2009-06-08 21:22) [1]

да
WINXP, delphi 7


 
vrem   (2009-06-08 21:24) [2]

ну так в интегере же из 32 битов 1 на знак используется, а у тебя в примере число больше чем 31 бит. longword можно использовать если 32 бита хочется


 
Gydvin ©   (2009-06-08 21:39) [3]

о блин! пасиб! что-то не подумал


 
AndreyV ©   (2009-06-09 05:00) [4]

> [2] vrem   (08.06.09 21:24)
> ну так в интегере же из 32 битов 1 на знак используется

Это не так.


 
@!!ex ©   (2009-06-09 09:42) [5]

> [4] AndreyV ©   (09.06.09 05:00)
> Это не так.

Вы сломали мои знания о машинном представлении целых знаковых.
А как?


 
AndreyV ©   (2009-06-09 10:34) [6]

> [5] @!!ex ©   (09.06.09 09:42)
> > [4] AndreyV ©   (09.06.09 05:00)
> > Это не так.
>
> Вы сломали мои знания о машинном представлении целых знаковых.
> А как?

Я вот о чём.

Не корректно говорить для знакового целого "из 32 битов 1 на знак используется", это означает
+1(10) 00000001(16)
-1(10) 80000001(16)
а так же подразумевает два нуля
+0(10) 00000000(16)
-0(10) 80000000(16)
На самом деле и аппаратно в x86
+1(10) 00000001(16)
-1(10) ffffffff(16)


 
sniknik ©   (2009-06-09 13:13) [7]

> Не корректно говорить для знакового целого "из 32 битов 1 на знак используется", это означает
корректно. там действительно 32 бита и действительно 1 из них признак знака

> а так же подразумевает два нуля
не подразумевает. это только твоя интерпретация числа. твое неправильное понимание, а на самом деле
> -1(10) 80000001(16)
это не -1
а это
> -0(10) 80000000(16)
не -0
но тем не менее это нормальные отрицательные (используется признак) числа.

> На самом деле и аппаратно в x86
а вот тут угадал.

и кстати ты подписываешь (16) а числа приводишь в (32).

p.s. я в ответе за свои слова, а не за то, что вы подумали. @ Бомарше


 
AndreyV ©   (2009-06-09 14:15) [8]

> [7] sniknik ©   (09.06.09 13:13)
> > Не корректно говорить для знакового целого "из 32 битов 1 на знак используется"
> корректно. там действительно 32 бита и действительно 1 из них признак знака

Ну признак, хотя для понимания сабжа требуется уточнение.

> > а так же подразумевает два нуля
> не подразумевает. это только твоя интерпретация числа. твое неправильное понимание, а на самом деле

Вот и я об интерпретации.

> > -1(10) 80000001(16)
> это не -1
> а это
> > -0(10) 80000000(16)
> не -0
> но тем не менее это нормальные отрицательные (используется признак) числа.
>
> > На самом деле и аппаратно в x86
> а вот тут угадал.

Ага, на кофейной гуще.

> и кстати ты подписываешь (16) а числа приводишь в (32).

16 - основание системы исчисления в которой записано для краткости побитное представление числа

> p.s. я в ответе за свои слова, а не за то, что вы подумали.
> @ Бомарше

Ну да.:)

Вобщем всё к тому, что в том представлении, какое есть (забыл как оно называется), вычитание становится не нужным и реализуется сложением, и ноль остаётся один и отрицательных чисел на одно больше, чем положительных. А вот принятой в математике записи не соответсвует.


 
Sapersky   (2009-06-09 17:00) [9]

Включённый в настройках проекта overflow checking такое должен ловить.


 
sniknik ©   (2009-06-09 19:08) [10]

> Ну признак, хотя для понимания сабжа требуется уточнение.
ну и уточнял бы, а не говорил, что "это не так".

> 16 - основание системы исчисления в которой записано для краткости побитное представление числа
16 это ffff, посчитай
а ты пишешь
> -1(10) ffffffff(16)
в 2 раза больше. т.е. 32.

ты бы лучше  пытался понять, что говорят, а не бросался прописными истинами непонятно к чему относящимися.

> А вот принятой в математике записи не соответсвует.
если бы говорили про математику то признаком отрицательного числа назвали бы минус (-) стоящий перед числом.


 
AndreyV ©   (2009-06-09 20:39) [11]

> [10] sniknik ©   (09.06.09 19:08)

Да, сразу не уточнил, вот ты и добавил точности. А с 16 против 32: я так и не понял - как связана разрядность с формой записи в моём посте - ведь в сабже говорилось о 32-х битах, а 16, как я уже уточнил - основание системы исчисления (там, в предыдущем посте).

Да и действительно - не стоит мусолить далее эти прописные истины.


 
AndreyV ©   (2009-06-10 02:55) [12]

> [11] AndreyV ©   (09.06.09 20:39)
> основание системы исчисления

основание системы счисления



Страницы: 1 вся ветка

Текущий архив: 2009.08.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
2-1244387529
Nikfel
2009-06-07 19:12
2009.08.09
Как читать файл по байтам?


6-1205160643
alexm_hs
2008-03-10 17:50
2009.08.09
Как работать с MIB-файлами?


1-1211807227
9899100
2008-05-26 17:07
2009.08.09
помогите найти ошибку


2-1245065034
b/@.
2009-06-15 15:23
2009.08.09
Какое практическое применение UniqueString ?


11-1205170056
DJ_UZer
2008-03-10 20:27
2009.08.09
Файлы