Главная страница
    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.48 MB
Время: 0.042 c
3-1158774261
anton773
2006-09-20 21:44
2006.11.19
количество записей в секунду


15-1162381911
StriderMan
2006-11-01 14:51
2006.11.19
Что мешает программистам работать дома?


6-1151226870
po4ti novi4ok
2006-06-25 13:14
2006.11.19
вопрос по TIdTcpServer


15-1162080321
default
2006-10-29 03:05
2006.11.19
Вопрос на подумать


2-1162433136
viper03
2006-11-02 05:05
2006.11.19
помогите с sql





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский