powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Записать два значения Word в Cardinal
16 сообщений из 16, страница 1 из 1
Записать два значения Word в Cardinal
    #39773374
amadeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо записать два значения типа Word в одно Cardinal. Насколько я понимаю, размерность позволяет: 2 байта в Word и 4 байта в Cardinal. Такой код работает только для Int64:

Код: pascal
1.
11123 + 35548 shl 16



Для Cardinal выдает ошибку:

Constant expression violates subrange bounds

Что я неправильно делаю?
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773380
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amadeusЧто я неправильно делаю?

Используешь знаковые целые вместо вордов. 35548 больше чем 32768 и в 16 бит не влазят.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773398
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
Word(11123) or (Word(35548) shl 16)
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773399
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amadeus
Код: pascal
1.
35548 shl 16


Для Cardinal выдает ошибку:

Constant expression violates subrange bounds

Что я неправильно делаю?


во-первых то, что (35548 shl 16) = 18446744071744258048
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773407
amadeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, значит, ошибка не в формуле. Подстановка вместо чисел переменных типа Word решила проблему.
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773412
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд, Dimitry Sibiryakov

Десятичные 35548 - это шестнадцатеричные 8ADC, что меньше FFFF(65535).
Сдвиг влево на 16 будет 8ADC 0000. Что в десятичной 2329673728.
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773422
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хочется красоты то еще так можно:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
type
  TMyCardinal = record
    case b: Byte of
      1: (Cardinal : Cardinal);
      2: (Word: array [1..2] of WORD);
  end;

var
  R: TMyCardinal;

begin
  R.Word[1]:=35548;
  R.Word[2]:=11123;
  Writeln(R.Cardinal);
end.
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773427
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чо тут изобретать то?

Windows.MakeLong(a, b: Word): Longint;
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773438
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45Квейд, Dimitry Sibiryakov

Десятичные 35548 - это шестнадцатеричные 8ADC, что меньше FFFF(65535).
Сдвиг влево на 16 будет 8ADC 0000. Что в десятичной 2329673728.

точно, это я со знаком накосячил
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773439
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Ничего что function MakeLong возвращает не cardinal?
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773473
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13.02.2019 15:25, rgreat пишет:
> Ничего что function MakeLong возвращает не cardinal?

это в дельфях она так задекларирована.
а возвращает она то, что нужно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773589
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийэто в дельфях она так задекларирована.
а возвращает она то, что нужно.
cardinal и longInt - это разные вещи.
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773607
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МимопроходящийWindows.MakeLong(a, b: Word): Longint;
Тогда уж
Код: pascal
1.
cardinal( MakeLong( a, b : word ) )
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773613
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

И все это крякнеться если в проекте overflow check включен.
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773615
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
function MakeLong(A, B: Word): Longint;
begin
  Result := A or B shl 16;
end;


Хотя не. Это не крякнеться. 8-/
...
Рейтинг: 0 / 0
Записать два значения Word в Cardinal
    #39773827
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovТогда уж
Код: pascal
1.
cardinal( MakeLong( a, b : word ) )



rgreat И все это крякнеться если в проекте overflow check включен.
Хотя не. Это не крякнеться. 8-/


Если бы крякалось, то можно было бы извратиться с дефайнами:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
{$IFOPT Q+}
  {$DEFINE QMINUS}
  {$Q-}
{$ENDIF}

  cardinal( MakeLong( a, b : word ) )

{$IFDEF QMINUS}
  {$UNDEF QMINUS}
  {$Q+}
{$ENDIF}
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Записать два значения Word в Cardinal
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]