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

Вниз

unsigned 64-bit   Найти похожие ветки 

 
_longint   (2006-11-03 09:27) [0]

unsigned 64-bit — такое понятие вообще существует? или максимальный unsigned 32-bit?


 
Anatoly Podgoretsky ©   (2006-11-03 09:28) [1]

> _longint  (03.11.2006 09:27:00)  [0]

Существует и unsigned 128-bit


 
_longint   (2006-11-03 09:33) [2]

И какой тип переменной за это отвечает в delphi? (если в delphi есть такое конечно)


 
Anatoly Podgoretsky ©   (2006-11-03 09:40) [3]

> _longint  (03.11.2006 09:33:02)  [2]

В Дельфи никакой
Но ты можешь использовать для 64 бит LongWord в диапазоне до 2^63


 
Percent   (2006-11-03 09:49) [4]

Максимум в Delphi 6 - signed 64-bit, int64
Вообще, справка по этому поводу дает исчерпывающую информацию.
Мало того, что есть - реализуй свои типы и/или классы.


 
MBo ©   (2006-11-03 09:49) [5]

>Anatoly Podgoretsky ©   (03.11.06 09:40) [3]
LongWord = DWord, так что не пойдет, видимо


 
Anatoly Podgoretsky ©   (2006-11-03 10:21) [6]

> MBo  (03.11.2006 09:49:05)  [5]

Я ошибся, имел в виду Int64


 
guav ©   (2006-11-03 13:12) [7]

есть UInt64


 
guav ©   (2006-11-03 13:15) [8]

> [4] Percent   (03.11.06 09:49)
> , справка по этому поводу дает исчерпывающую информацию.

Про UInt64 справка не знает, а ведь он есть


 
palva ©   (2006-11-03 13:39) [9]

guav ©   (03.11.06 13:15) [8]
> Про UInt64 справка не знает, а ведь он есть

Похоже, что UInt64 ничем не отличается от Int64:

{$APPTYPE CONSOLE}
var
 ui64: UInt64;
begin
 ui64 := $7FFFFFFFFFFFFFFF;
 WriteLn(ui64);  // 9223372036854775807
 ui64 := ui64 + 1;
 WriteLn(ui64);  // -9223372036854775808
 ui64 := ui64 div 10;
 WriteLn(ui64);  // -922337203685477580
end.


 
guav ©   (2006-11-03 13:42) [10]

> [9] palva ©   (03.11.06 13:39)

Нет, на самом деле UInt64 - это истинно беззнаковый 64битный тип, просто ни WriteLn ни другие способы вывода его не поддерживают.

Вот демонстрация различия:
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Lines.Add(intToStr(Low(UInt64) shr 2));
Memo1.Lines.Add(intToStr(High(UInt64) shr 2));
Memo1.Lines.Add(intToStr(Low(Int64) shr 2));
Memo1.Lines.Add(intToStr(High(Int64) shr 2));
end;


 
MeF Dei Corvi ©   (2006-11-03 13:44) [11]

{$APPTYPE CONSOLE}
begin
 writeln(High(UInt64));
 writeln(Low(UInt64));
 readln;
end.

Возвращает:
18446744073709551615
0


 
palva ©   (2006-11-03 13:46) [12]

guav ©   (03.11.06 13:42) [10]
Не только WriteLn с ним не работает, но также и арифметические операции, например div. Что показывает мой пример.


 
guav ©   (2006-11-03 13:47) [13]

> [11] MeF Dei Corvi ©   (03.11.06 13:44)

Ну значит поддерживает, тогда дело в другом, арифметика не поддерживает.
Format и IntToStr не поддерживают.


 
guav ©   (2006-11-03 13:49) [14]

> [12] palva ©   (03.11.06 13:46)

Ну не работает, но диапазон то правильный, что следующие два примера показывают.


 
Ketmar ©   (2006-11-03 13:56) [15]

>[14] guav(c) 3-Nov-2006, 13:49
>Ну не работает, но диапазон то правильный, что следующие
>два примера показывают.
обалдеть. а поясни-ка мне разницу между знаковым и беззнаковым int64, если последний никто не поддерживает.


 
palva ©   (2006-11-03 13:59) [16]

> Возвращает:
> 18446744073709551615

Это конечно, хорошо. Попробую пояснить. Пусть я собираюсь вычислять
a^b mod m,
то есть я присваиваю s единицу и делаю b раз следующее: умножаю s на a и беру по модулю m. Если s имеет тип UInt64 и если результат очередного умножения не превысит вышеуказанное число 18446744073709551615, то я имею право предположить, что все будет работать правильно. Однако... как мы видели произведение не должно превышать 9223372036854775807, в противном случае даже знак будет не тот.


 
guav ©   (2006-11-03 14:08) [17]

> [15] Ketmar ©   (03.11.06 13:56)

Разница в том что компилятор таки думает что UInt64 беззнаковый.
procedure Test(I: Uint64);
begin
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Test(-1);
end;


Подобная проблема была со сторонним компонентом (в котором кто-то пытался использовать этот хитрый тип, причём не к месту), решил добавлением type UInt64 = Int64; . Оттуда и узнал про существование его.

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


 
Ketmar ©   (2006-11-03 17:20) [18]

>[17] guav(c) 3-Nov-2006, 14:08
>Разница в том что компилятор таки думает что UInt64
>беззнаковый.
таки работает с ним он всё равно неверно. так что чем-то не тем он думает. %-)


 
Mystic ©   (2006-11-03 17:43) [19]

Ой, напомнили... Я уже два дня вожусь с этими unsigned long long, только в Ц. Потихоньку от битовых операций мозги заворачиваются...



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

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

Наверх




Память: 0.51 MB
Время: 0.049 c
8-1144895893
Delphi_uzer
2006-04-13 06:38
2006.11.19
Движение картинки к точке...


15-1162300387
Rule
2006-10-31 16:13
2006.11.19
Интересуюсь компонтой типа встроенного веб броузера


10-1124628776
teddy
2005-08-21 16:52
2006.11.19
Ошибка при вызове оле объекта


2-1162454076
m-kirill-2003
2006-11-02 10:54
2006.11.19
Excel и delphi


15-1162238370
Petr V.Abramov
2006-10-30 22:59
2006.11.19
нЕ или нИ?