Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Большие числа.


Влад ©   (2007-01-08 18:17:00) 


var A:uint64;
begin
A:= $B7E151628AED2A6B; //[Error] Constant expression violates subrange bounds

Как я понял, константа слишком большая.
Однако:

var A: int64;
begin
A:= $B7E151628AED2A6B; //[Error] Constant expression violates subrange bounds

ошибки не вызывает. Почему? Ведь uint64 измеряется от 0 до 2^64-1 (а число в этот промежуток входит). Как с этим бороться?


sniknik   (2007-01-08 19:22:00) [1]

2006


Влад   (2007-01-08 19:12:00) [2]


> может в более поздней дельфе посмотреть


А какая самая последняя? У меня 7.0 Build 4.453


sniknik   (2007-01-08 19:03:00) [3]

> и при преобразовании к uint64
ошибка копи пасте надо читать "к int64"


sniknik   (2007-01-08 19:02:00) [4]

там оно как интеджер, знаковое представлено (ну не "развит" еще тип ;), может в более поздней дельфе посмотреть),
попробуй арифметические операции с ним, можно увидеть что результат как от беззнакового.  (ну если например поделить на достаточно большое число, чтобы старший бит который у знаковых за знак отвечает освободился, то увидишь неотрицательное и при преобразовании к uint64. а ведь деление на знак не влияет)

но вот что плохо, при любом приведении и передачи в знаковый параметр оно автоматом его поменяет ;(, и ошибок не выдаст.


Влад   (2007-01-08 18:39:00) [5]

Только вот в Watches наблюдаю A все равно как отрицательное. Или это Watches неправильно отображает uint64 числа?


Влад   (2007-01-08 18:33:00) [6]

спасибо.


sniknik   (2007-01-08 18:30:00) [7]

var A:uint64;
begin
A:= uint64($B7E151628AED2A6B);
//чтобы не восприняло константу как отрицательный int64


Влад   (2007-01-08 18:17:00) [8]

Второй код неправильно напечатал.

var A:int64;
begin
A:= $B7E151628AED2A6B;


Наверх

Титульная страница Поиск, карта сайта Написать письмо