![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Целый тип 8 байт [D7, NT4, 2000, XP]
Влад © (2007-01-02 16:53:00)Как создать целый тип диапазоном от 0 до 2^64-1 (на 8 байт)?
Будут ли с ним корректно работать операции xor, shl, shr, mod, div, +- и т.д.?
Sha (2007-01-03 00:52:00) [1]> palva ©
Кстати, ничто не мешает написать свое деление по образцу Борланда с минимальными изменениями.
Sha (2007-01-03 00:42:00) [2]> palva © (03.01.07 00:35) [33]
ага,
а деление не работает не только из-за расширения знакового разряда,
там и команды разные.
Sha (2007-01-03 00:35:00) [3]Вот самая страшная тайна масонов:
i mod 8 = i and 7
palva (2007-01-03 00:35:00) [4]Sha © (03.01.07 00:05) [30]
Да, точно. Умножение тоже работает.
Sha (2007-01-03 00:22:00) [5]> Влад (03.01.07 00:15) [31]
а основание у mod какое? :)
Влад (2007-01-03 00:15:00) [6]а mod чем не деление?
Sha (2007-01-03 00:05:00) [7]> palva © (02.01.07 23:54) [27]
Сложение, вычитание и умножение для знаковых и беззнаковых
выполняется при помощи одних и тех же машинных команд,
а делить ему скорее всего и не надо, т.к. в алгоритмах шифрования
деление обычно не используется.
Влад (2007-01-02 23:57:00) [8]palva, большое спасибо. Теперь хоть понял, что не работает.
palva (2007-01-02 23:56:00) [9]Пропустил точку с запятой:
l, h: LongWord;
palva (2007-01-02 23:54:00) [10]> Как создать целый тип диапазоном от 0 до 2^64-1 (на 8 байт)?
Тип не создают, тип определяют, для вашего случая нужно определить запись, например так:
type
TMyType = record
l, h: LongWord
end;
Потом реализовать функции, которые производят над этой записью арифметические операции.
> Будут ли с ним корректно работать операции xor, shl, shr, mod, div, +- и т.д.?
Естественно, не будут. Эти операции применимы к целым числам а не к записям. int64 вам тоже не подойдет.
Если будете использовать int64, тогда будут правильно работать +, -, сдвиги и логические операции. Умножение и деление будут работать неправильно.
Пример:
{$APPTYPE CONSOLE}
uses SysUtils;
var
ii: Int64;
begin
ii := $8000000000000000;
ii := ii div 2; // результат неправильный, поскольку комплиятор
// считает это число отрицательнлым.
WriteLn(IntToHex(ii, 16)); // C000000000000000
ii := ii SHR 2; // а здесь работает правильно
WriteLn(IntToHex(ii, 16)); // 3000000000000000
ReadLn
end.
Если в этом примере заменить Int64 на UInt64, то на BDS выводятся нули в обоих случаях. На D7 попробовать не могу, но там, насколько я когда-то пробовал UInt64 работает идентично Int64.
Sha (2007-01-02 23:32:00) [11]Интересно, чем не угодил int64?
Количество битов у него то же.
Влад (2007-01-02 23:28:00) [12]За uint64 спасибо, а нужен он будет, например, для шифра 64/12/16
Sha (2007-01-02 23:20:00) [13]Во-первых, начиная с D7, кажется, есть uint64.
Во-вторых, непонятно, для какой операции тебе не подходит int64?
Влад (2007-01-02 23:14:00) [14]Уже ответил [3] :)
Sha (2007-01-02 23:10:00) [15]Уже ответили [1] и [4].
Влад (2007-01-02 23:08:00) [16]
> Как создать целый тип диапазоном от 0 до 2^64-1 (на 8 байт)?
>
> Будут ли с ним корректно работать операции xor, shl, shr,
> mod, div, +- и т.д.?
:))
Sha (2007-01-02 23:06:00) [17]Ты бы лучше вопрос мне задал.
Несложный :)
Влад (2007-01-02 23:04:00) [18]Ну посмотрел я. И так знаю, что программирую херово. Ты мне лучше б ошибки в моей программе указал.
Sha (2007-01-02 22:50:00) [19]сначала посмотри, как люди делают:
http://www.torry.net/pages.php?id=519
Влад (2007-01-02 22:47:00) [20]А мне надо свою.