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

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



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

Constant expression violates subrange bounds

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

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


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

Constant expression violates subrange bounds

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


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

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

Код: 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
13.02.2019, 15:10
    #39773427
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Записать два значения Word в Cardinal
чо тут изобретать то?

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

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

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

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

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

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


Хотя не. Это не крякнеться. 8-/
...
Рейтинг: 0 / 0
14.02.2019, 13:37
    #39773827
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Записать два значения Word в Cardinal
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Записать два значения Word в Cardinal / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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