Форум: "Основная";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
ВнизПроблема с получением правильного числа при конвертации. Найти похожие ветки
← →
Mouserx (2006-07-28 14:57) [0]Имееться число, например -90. Если представить 2-мя байтами в HEX виде, то будет FFA6.
Так вот, если "FFA6" у меня в виде строки, то при переводе в переменную типа integer мне дает 65446. а я хочу видеть - 90. Как правильно сделать?
← →
Сергей М. © (2006-07-28 15:03) [1]
> Если представить 2-мя байтами в HEX виде, то будет FFA6
А если чеверкой байтов, то FFFFFFA6.
При этом обратный перевод в Integer никаких проблем не вызовет.
← →
Reindeer Moss Eater © (2006-07-28 15:04) [2]Имееться число, например -90. Если представить 2-мя байтами в HEX виде, то будет FFA6.
Это word
то при переводе в переменную типа integer
А это четыре байта, а не два.
Вот и вся причина
← →
Stanislav © (2006-07-28 15:05) [3]65446-65536 Будет -90
← →
Mouserx (2006-07-28 15:06) [4]А какой мне надо использовать тип переменной, чтобы хранить число в 2 байта, которое может быть и отрицательным? ... и как правильно сконвертировать из строки в эту переменную?
← →
Mouserx (2006-07-28 15:07) [5]Stanislav © (28.07.06 15:05) [3]
эт я вкурсе, но не писать же в коде, что если старший битик единица, то использовать формулу типа твоей. Может есть попроще способы?
← →
Сергей М. © (2006-07-28 15:07) [6]
> какой мне надо использовать тип переменной, чтобы хранить
> число в 2 байта
Любой, размер которой не меньше 2-х байт.
Но лучше почитать букварь.
← →
Stanislav © (2006-07-28 15:08) [7]Да тип Word
← →
DprYg © (2006-07-28 15:11) [8]Тип Word не может хранить отрицательные числа. SmallInt(-32768 32767)
← →
Mouserx (2006-07-28 15:13) [9]
> Любой, размер которой не меньше 2-х байт.
Integer же явно не меньше 2-х байт, но при этом такой код неработает как надо:
var
Value_str : String;
Value : Integer;
begin
Value_str := "FFA6";
Value := StrtoInt("$"+Value_str);
end;
> Stanislav © (28.07.06 15:08) [7]
>
> Да тип Word
Тип Word не может хранить отрицательные числа.
← →
Мефисто (2006-07-28 15:13) [10]
> Mouserx (28.07.06 15:06) [4]
Integer + F1
Generic integer types for 32-bit implementations of Delphi
Type Range Format
Integer -2147483648..2147483647 signed 32-bit
Cardinal 0..4294967295 unsigned 32-bit
Fundamental integer types include Shortint, Smallint, Longint, Int64, Byte, Word, and Longword.
Fundamental integer types
Type Range Format
Shortint -128..127 signed 8-bit
Smallint -32768..32767 signed 16-bit
Longint -2147483648..2147483647 signed 32-bit
Int64 -2^63..2^63-1 signed 64-bit
Byte 0..255 unsigned 8-bit
Word 0..65535 unsigned 16-bit
Longword 0..4294967295 unsigned 32-bit
← →
Сергей М. © (2006-07-28 15:15) [11]
> Mouserx (28.07.06 15:13) [9]
>
>
> > Любой, размер которой не меньше 2-х байт.
>
> Integer же явно не меньше 2-х байт, но при этом такой код
> неработает как надо:
> var
> Value_str : String;
> Value : Integer;
>
> begin
> Value_str := "FFA6";
> Value := StrtoInt("$"+"FFFF" + Value_str);
> end;
>
← →
Stanislav © (2006-07-28 15:18) [12]DprYg © (28.07.06 15:11) [8]
Точно!
← →
Mouserx (2006-07-28 15:20) [13]Все спасибо. Разобрался.
Подходящее решение нашел в [11]
← →
Reindeer Moss Eater © (2006-07-28 15:22) [14]Просто при изначальной конвертации в hex надо было сразу заказывать нужную длину что бы получался integer, а не word
← →
Сергей М. © (2006-07-28 15:37) [15]
> Mouserx (28.07.06 15:20) [13]
> Подходящее решение нашел
Плохое это решение.
Хорошее же ты получил бы при полной и грамотной постановке своей задачи.
← →
sniknik © (2006-07-28 15:49) [16]> Подходящее решение нашел в [11]
а теперь сконвертируй аналогично 90 ....
тебе нужно делать анализ крайнего левого бита в 16ричном числе (он отвечает за знак), либо как советуют изначально конвертить в то длинну какого типа числа используеш.
← →
DprYg © (2006-07-28 15:50) [17]
var a : smallint;
begin
a := smallint($FFA6);
Form1.Caption := IntToStr(a);
end;
← →
sniknik © (2006-07-28 15:53) [18]> левого бита в 16ричном числе
в смысле, тут же строковое представление, тут надо просто выделить символы у которых в числовом проедставлении левый бит установлен. т.е $8x, $9x, $Ax, ... $Fx где x дюбое число.
← →
Ketmar © (2006-07-28 16:14) [19]>Mouserx (28.07.06 15:20) [13]
мда. а потом такой код пихают в программы...
← →
Mouserx (2006-07-28 17:17) [20]
> Ketmar © (28.07.06 16:14) [19]
мда. а потом такой код пихают в программы...
Не такой. Это был просто тест. а точнее закрепление теории практикой.
У меня же на самом деле подходит Shortint с диапазоном -128..127.
Просто в тех. задании одна и таже переменная фигурирует как 1 байт, но в 1 месте как 2 байта. Это ошибка и чуток сбила меня с толку, что начал все путать.
Пятница ... конец рабочего дня. Надо явно выключать компьютер и идти отдыхать. :-)
← →
Ketmar © (2006-07-28 18:06) [21]я про [11].
← →
palva © (2006-07-29 23:24) [22]Логично сделать так:
{$APPTYPE CONSOLE}
uses SysUtils;
var
si: SmallInt;
begin
si := StrToInt("$" + "FFA6");
WriteLn(si);
end.
Или даже так:
si := StrToInt("$" + "FFA6") And $FFFF;
← →
GrayFace © (2006-07-30 05:45) [23]Или так: si := smallint(word(StrToInt("$" + "FFA6")));
← →
Anatoly Podgoretsky © (2006-07-30 15:46) [24]И тут Остапа понесло
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.069 c