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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2014, 11:13   #1
Xo66um
Форумчанин
 
Регистрация: 11.05.2013
Сообщений: 154
По умолчанию Преобразовать отрицательное число

Всем привет.
Собственно, такой вопрос: как можно преобразовать отрицательное число в шестнадцатеричную систему счисления? С положительными числами все нормально, а вот с отрицательными какой-то хаос.

Например, если перевести число -120 в HEX, то получаю FFFFFF88, а результат перевести обратно в десятичную систему, то получаем 4294967176. Хотя на самом деле результат преобразования -120 должен быть 88 (в HEX).
Как с этим бороться?

Преобразовываю так:
Код:
IntToHEX(-120,8)
Xo66um вне форума Ответить с цитированием
Старый 25.01.2014, 11:28   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для того, что бы не задавать таких вопросов, нужно знать как двоичные числа представлены в памяти. Ознакомиться можно например здесь
http://comp-science.narod.ru/Cod/cod.html

А перевести в hex можно так
Код:
  s:=IntToHex(Abs(x),8);
  if x<0 then s:='-'+s;
Или в одну строку, но заумно
Код:
  s:=Copy('-',1,-Sign(x))+IntToHex(Abs(x),8);
PS

Можно и оставить как есть (x: Integer)

Код:
s=IntToHex(x,8);
А обратное преобразование делать так

Код:
x:=StrToInt('$'+s);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 25.01.2014 в 11:49.
Аватар вне форума Ответить с цитированием
Старый 25.01.2014, 12:54   #3
blackstrip
Форумчанин
 
Аватар для blackstrip
 
Регистрация: 21.01.2012
Сообщений: 240
По умолчанию

Цитата:
Сообщение от Xo66um Посмотреть сообщение
Всем привет.
Собственно, такой вопрос: как можно преобразовать отрицательное число в шестнадцатеричную систему счисления? С положительными числами все нормально, а вот с отрицательными какой-то хаос.

Например, если перевести число -120 в HEX, то получаю FFFFFF88, а результат перевести обратно в десятичную систему, то получаем 4294967176. Хотя на самом деле результат преобразования -120 должен быть 88 (в HEX).
Как с этим бороться?

Преобразовываю так:
Код:
IntToHEX(-120,8)
Суть в том, что для 16-тиричного числа нужно знать какая у него разрядность (сколько бит).

Если мы работаем с 8-битными знаковыми числами, то это будут числа от -128 (80H, 10000000) до 127 (7FH, 01111111). Первый бит - знаковый. У всех чисел от 0 до 127 он будет равен нулю. А как только выставится в единицу - это уже отрицательное число. И 10000000 - это будет -128, 10000001 - это -127, 11111111 - это -1.

Поэтому "если перевести число -120 в HEX, то получаю FFFFFF88" - это для 4-байтовых чисел (32-битных). А для 1-байтовых (8-битных) - будет как положено (как и написано в вашем посте) 88H.

IntToHex позволяет указать вторым параметром минимальное число символов. Поэтому IntToHex(10,1) = "A", IntToHex(10,4) = "000A". Но если указать отрицательное число на входе - то все равно дельфи выдаст для 32-битного числа результат (FFFFFF88).

Поэтому можно извратиться вот так: если число N 100% будет находиться между значениями от -128 до 127 (т.е. в пределах 1 байта), то:
- если N >= 0, то выводить IntToHex(N,2)
- если N < 0, то выводить IntToHex(N+256,2)
blackstrip вне форума Ответить с цитированием
Старый 25.01.2014, 13:20   #4
Xo66um
Форумчанин
 
Регистрация: 11.05.2013
Сообщений: 154
По умолчанию

Аватар, а зачем отсекать минус? Так мы просто превращаем знаковое в беззнаковое число, и работаем с ним как с положительным. Результат такого преобразования будет равен 120 (DEC) и 78 (HEX). Хотя должно получиться -120 (DEC) и 88 (HEX).

blackstrip, спасибо большое за объяснение и решение проблемы! Я с 1 байтом работаю, так что мне большего и не надо

Последний раз редактировалось Xo66um; 25.01.2014 в 13:24.
Xo66um вне форума Ответить с цитированием
Старый 25.01.2014, 13:34   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,873
По умолчанию

Цитата:
Я с 1 байтом работаю, так что мне большего и не надо
А в Паскале/Делфи нет однобайтного знакового целого типа.
northener вне форума Ответить с цитированием
Старый 25.01.2014, 13:37   #6
Xo66um
Форумчанин
 
Регистрация: 11.05.2013
Сообщений: 154
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
А в Паскале/Делфи нет однобайтного знакового целого типа.
1 байтовые: Shortint (знаковое) и Byte (беззнаковое) - пока неплохо работают.

Последний раз редактировалось Xo66um; 25.01.2014 в 13:50.
Xo66um вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Числовое поле не вводится сразу отрицательное число DeveloPerchik Общие вопросы Delphi 3 15.08.2012 21:25
Преобразовать отрицательное число в положительное valerij Microsoft Office Excel 7 26.10.2011 09:32
utorrent отрицательное число в строке сиды ololo-schoolboy Софт 5 07.01.2011 14:02
Отрицательное число в дробную степень n4ela Общие вопросы C/C++ 7 31.10.2010 00:02
Число как текст преобразовать в число agregator Microsoft Office Excel 5 28.04.2010 06:08