|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
25.01.2014, 11:13 | #1 |
Форумчанин
Регистрация: 11.05.2013
Сообщений: 154
|
Преобразовать отрицательное число
Всем привет.
Собственно, такой вопрос: как можно преобразовать отрицательное число в шестнадцатеричную систему счисления? С положительными числами все нормально, а вот с отрицательными какой-то хаос. Например, если перевести число -120 в HEX, то получаю FFFFFF88, а результат перевести обратно в десятичную систему, то получаем 4294967176. Хотя на самом деле результат преобразования -120 должен быть 88 (в HEX). Как с этим бороться? Преобразовываю так: Код:
|
25.01.2014, 11:28 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Для того, что бы не задавать таких вопросов, нужно знать как двоичные числа представлены в памяти. Ознакомиться можно например здесь
http://comp-science.narod.ru/Cod/cod.html А перевести в hex можно так Код:
Код:
Можно и оставить как есть (x: Integer) Код:
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 25.01.2014 в 11:49. |
25.01.2014, 12:54 | #3 | |
Форумчанин
Регистрация: 21.01.2012
Сообщений: 240
|
Цитата:
Если мы работаем с 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) |
|
25.01.2014, 13:20 | #4 |
Форумчанин
Регистрация: 11.05.2013
Сообщений: 154
|
Аватар, а зачем отсекать минус? Так мы просто превращаем знаковое в беззнаковое число, и работаем с ним как с положительным. Результат такого преобразования будет равен 120 (DEC) и 78 (HEX). Хотя должно получиться -120 (DEC) и 88 (HEX).
blackstrip, спасибо большое за объяснение и решение проблемы! Я с 1 байтом работаю, так что мне большего и не надо Последний раз редактировалось Xo66um; 25.01.2014 в 13:24. |
25.01.2014, 13:34 | #5 | |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,894
|
Цитата:
|
|
25.01.2014, 13:37 | #6 |
Форумчанин
Регистрация: 11.05.2013
Сообщений: 154
|
1 байтовые: Shortint (знаковое) и Byte (беззнаковое) - пока неплохо работают.
Последний раз редактировалось Xo66um; 25.01.2014 в 13:50. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Числовое поле не вводится сразу отрицательное число | 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 |