Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.117 c
15-1162563306
Rikki
2006-11-03 17:15
2006.11.19
HELP!!!!!!


1-1159865750
Sham
2006-10-03 12:55
2006.11.19
Проблема с типами данных


2-1162559308
проходил мимо решил заглянуть
2006-11-03 16:08
2006.11.19
StringGrid


3-1158320321
Neo Trinitron
2006-09-15 15:38
2006.11.19
Громаднейшие запросы SQL


1-1160488144
Dush
2006-10-10 17:49
2006.11.19
VB в Delphi (AndAlso и OrElse)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский