Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2019, 21:02   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию Диапазоны целочисленных констант

Всем привет. Давненько не виделись
Подскажите, почему так?
Код
Код:
var
  i: UInt32;
begin
  i := 1 shl 31;
  ShowMessage (IntToStr (i));
end;
Выдаёт:
Цитата:
[dcc32 Error] MainForm.pas(32): E1012 Constant expression violates subrange bounds
А вот ток
Код:
var
  i: UInt32;
begin
  i := UInt32(1 shl 31);
  ShowMessage (IntToStr (i));
end;
Уже нормально:
Цитата:
2147483648
При чем
Код:
  i := 1 shl 30;
работает
Sibedir вне форума Ответить с цитированием
Старый 02.05.2019, 21:05   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Он что, типа по умолчанию целочисленные константы считает знакопеременными?

Ваще логика странная
Код:
var
  i: Int64;
begin
  i := 1 shl 31;
  ShowMessage (IntToStr (i));
end;
Цитата:
-2147483648

Последний раз редактировалось Sibedir; 02.05.2019 в 21:07.
Sibedir вне форума Ответить с цитированием
Старый 02.05.2019, 21:41   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Именованные не типизированные целочисленные константы имеют тип longint или int64, если выход за диапазон longint-а. Надо полагать это имеет отношение и к не именованным.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.05.2019, 21:46   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ну получается, что для не именованых это только longint (см. пост 2).
Sibedir вне форума Ответить с цитированием
Старый 02.05.2019, 21:53   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

там же в знаковый int64 присваивается longint(-2147483648) так, что так и должно быть.
i := UInt32(1 shl 31) // 2147483648 - тоже понятно - приведение к беззнаковому
а тот i := 1 shl 31 из #1 и ошибка пока не догоняю )

зы, там ошибка присвоения отрицательного беззнаковому типу
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 02.05.2019 в 22:05.
Аватар вне форума Ответить с цитированием
Старый 03.05.2019, 03:05   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Это уже весьма старый глюк папаши Борланда.
northener вне форума Ответить с цитированием
Старый 03.05.2019, 07:43   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чего глючного? Все согласно типа операнда и битового сдвига. А арифметического и циклического сдвига в делфи нет

add
мало того, Byte(1) shl 31 все равно вернет -2147483648, то есть Byte перед shl повышается до longint.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 03.05.2019 в 08:41.
Аватар вне форума Ответить с цитированием
Старый 03.05.2019, 16:21   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ну ладно, в принципе понятно.
Спасибо. Как всегда экономите кучу времени неучам, которые типа программируют. Разбогатею - отблагодарю
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачка. Диапазоны VladimirAvakov Помощь студентам 2 14.04.2016 00:54
диапазоны СУММЕСЛИ() Khalid Паскаль, Turbo Pascal, PascalABC.NET 0 12.03.2015 10:38
Диапазоны в VBA Outed Microsoft Office Excel 4 17.02.2015 08:38
Разбить на диапазоны! Seregakz Общие вопросы Delphi 3 21.09.2014 16:49
Как просуммировать диапазоны? Алексей11111 Microsoft Office Excel 7 28.11.2009 18:19