Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.10;
Скачать: CL | DM;

Вниз

Проблема с получением правильного числа при конвертации.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.036 c
2-1156146595
novill
2006-08-21 11:49
2006.09.10
Философское. Как правильнее выйти из процедуры?


3-1152077595
BanderLog
2006-07-05 09:33
2006.09.10
TIBScript + параметры


15-1156107099
Владимир_мпп
2006-08-21 00:51
2006.09.10
Часовой пояс?


2-1156233763
redlord
2006-08-22 12:02
2006.09.10
а есть ли функция обратная getwindowthreadprocessid


15-1155740135
X9
2006-08-16 18:55
2006.09.10
Разыскивается компонент