Как я могу получить результат больше, чем 2 ^ 32 от ШЛ? - PullRequest
6 голосов
/ 15 ноября 2011

Объявление ...

const
  n = 2 shl 33

установит постоянную n в значение 4 без каких-либо жалоб компилятора!

Также ...

Caption := IntToStr(2 shl 33);

...вернуть 4 вместо 8589934592. Похоже, компилятор вычисляет так:

2 шл 33 = 2 шл (33 и $ 1F) = 4

Но безлюбое предупреждение или переполнение.

Проблема остается, если мы объявляем:

const
  n: int64 = 2 shl 33;

Число в константе по-прежнему равно 4 вместо 8589934592.

Любой разумный обходной путь?

1 Ответ

13 голосов
/ 15 ноября 2011

Вы ищите неправильные результаты, согласно как компилятору Delphi, так и калькулятору Windows 7 в режиме программирования.(Ответ, который вы хотите получить, на самом деле 2 shl 32, кстати.)

Вам необходимо разыграть обе стороны от shl до Int64:

const
  n = Int64(2) shl Int64(33);

.1009 *

N = 17179869184;

Текущая документация (для XE2, но также относится и к более ранним версиям Delphi) отмечает это в Fundamental Integer Types.Тем не менее, на этой странице упоминается только, что один из операндов должен быть приведен как Int64;Мой тест показывает, что оба операнда должны быть приведены к типу в приведенном выше объявлении const - при приведении к типу только одного (независимо от того, какой из них) также получилось `n = 4; '.

...