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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2014, 18:42   #1
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию Размер числа

Здравствуйте, дано число

Код:
var
  x:cardinal;
begin
  x:=123;
end;
Размер Cardinal = 4 байта, как, зная число, вычислить реальный размер занимаемого пространства? Я не хочу писать все 4 байта если там одни нули ($00 00 00 7B)

Моё решение:
Код:
var
  j:byte;
  x:cardinal;
begin
  j:=0;
  x:=maxdword;
  while x<>0 do
  begin
    x:=x div 256;
    Inc(j);
  end;
  messagebox(0,'Размер x = '+pchar(inttostr(j)),0,0);
end;
Есть ли вариант по проще?
Здравствуйте

Последний раз редактировалось Stilet; 08.09.2014 в 21:00.
NEoMASTERR вне форума Ответить с цитированием
Старый 08.09.2014, 18:45   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Размер Cardinal = 4 байта, как, зная число, вычислить реальный размер занимаемого пространства? Я не хочу писать все 4 байта если там одни нули ($00 00 00 7B)
Никак. 4 байта это четыре байта. Размеры жестко заданы компилятором для зарезервироанных типов данных.

Если вы уверены что вам хватит и 2х байт, берите 2х байтовый тип.

переопределение типа переменной на этапе компиляции, в delphi, не возможно.

Но интереса ради можете написать функцию проверки которая проверит вхождение числа в диапазон типов и выдаст, в сколько байт оно помещается.

3 байта не существуют.

Последний раз редактировалось Человек_Борща; 08.09.2014 в 18:48.
Человек_Борща вне форума Ответить с цитированием
Старый 08.09.2014, 18:47   #3
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Никак. 4 байта это четыре байта. Размеры жестко заданы компилятором для зарезервироанных типов данных.

Если вы уверены что вам хватит и 2х байт, берите 2х байтовый тип.

переопределение типа переменной на этапе компиляции, в delphi, не возможно.
В том и дело что мне не хватит 2х байт, просто при передаче по сети каждый байт на счету
И компиляция тут не при чем, мне надо узнавать в ходе работы приложения
Здравствуйте
NEoMASTERR вне форума Ответить с цитированием
Старый 08.09.2014, 19:33   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

if x>65535 then 4 байта
else if>255 then 2 байта
else 1 байт

биты сто лет не нужны

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

Последний раз редактировалось Аватар; 08.09.2014 в 19:41.
Аватар вне форума Ответить с цитированием
Старый 08.09.2014, 20:43   #5
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
if x>65535 then 4 байта
else if>255 then 2 байта
else 1 байт

биты сто лет не нужны

ADD но при пересылке придется передавать размер числа в байтах
и лучше наверное

Код:
          case j of
           0..High(Byte)             : begin end;
           High(Byte)+1..high(word)  : begin end;
           High(word)+1..$FFFFFF     : begin end;
           $FFFFFF+1..high(dword)    : begin end;
          end;
А 3 байта?) и я знаю что надо передавать, вопрос был о другом, спасибо всем за помощь, остановился на своем же решении
Здравствуйте

Последний раз редактировалось Stilet; 08.09.2014 в 21:02.
NEoMASTERR вне форума Ответить с цитированием
Старый 08.09.2014, 20:52   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
А 3 байта
так же, только лень считать как в десятичном, в hex так:

if x>$FFFFFF then 4 байта
else if x>$FFFF then 3 байта
else if>$FF then 2 байта
else 1 байт
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.09.2014, 21:37   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
просто при передаче по сети каждый байт на счету
О каких объёмах данных идёт речь?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 08.09.2014, 22:54   #8
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

разницы нет, минимизировать траффик, уменьшить нагрузку. Люблю оптимизацию)

С 12 килобайтного ответа я сократил до 4 кб, умножить это на миллион пользователей и неплохо так выходит)
Еще zlib в помощь, и конфетка будет
Здравствуйте

Последний раз редактировалось NEoMASTERR; 08.09.2014 в 22:58.
NEoMASTERR вне форума Ответить с цитированием
Старый 09.09.2014, 00:43   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Еще zlib в помощь, и конфетка будет
Из 4х сделает 6 или 8.
Человек_Борща вне форума Ответить с цитированием
Старый 09.09.2014, 05:46   #10
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Из 4х сделает 6 или 8.
да что ж здесь одни критики собрались, ну 6 так 6 будет, ниче страшного, уберу.
Помимо чисел в пакете еще и строки
Здравствуйте

Последний раз редактировалось NEoMASTERR; 09.09.2014 в 05:51.
NEoMASTERR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переделать прогу на Ассемблере: в массиве чисел (размер - слово) попарно менять местами числа Алина27 Помощь студентам 1 18.12.2013 16:10
Создать массив из 3 элементов (размер 2 байта), хранящие числа в диапазоне - 32768..32767. kjrjgsnjd Помощь студентам 0 22.10.2012 20:54
размер числа в битах Coraline Общие вопросы C/C++ 6 16.05.2011 15:39