Народ, помогите!
Как преобразуются отрицательные целые в 16-ричную систему счисления!
Модератору: Пожалуйста, не удаляйте мой вопрос хотя бы пару часов!
Спасибо.
15.08.03 15:14: Перенесено модератором из 'C/C++' — ПК
Здравствуйте, veronika, Вы писали:
V>Народ, помогите! V>Как преобразуются отрицательные целые в 16-ричную систему счисления! V>Модератору: Пожалуйста, не удаляйте мой вопрос хотя бы пару часов! V>Спасибо.
Как в HEX — я уже нашла, а вот как обратно из такого HEX получить правильное отрицательное число? При обратном преобразовании получается очень большое положительное .
Здравствуйте, veronika, Вы писали:
VV>Как в HEX — я уже нашла, а вот как обратно из такого HEX получить правильное отрицательное число? При обратном преобразовании получается очень большое положительное .
Во-первых, дополнительный код нас спасает: (long)0xFFFFFFFF == (long)-1 == -0x00000001
Во-вторых, если у тебя строка вида [+/-]hhhhhhhh то распарсить ее легче легкого. Смотрим в сторону strtol().
long n = strtol("-FFFF", NULL, 16);
printf("n=%d\n");
// получаем n=-65536, что и требовалось
S> Тоже самое:
S> N = Not N + 1
S> Т.е. -5 = FB(16) S> 1) Not FB = 4 S> 2) 4 + 1 = 5;
S> FB(16) = -5 (10)
Большое спасибо!!
Еще вопрос: если я не знаю заранее отрицательное или положительное HEX-число я получила, как мне определить, что получено отрицательное?
Здравствуйте, veronika, Вы писали:
V>Народ, помогите! V>Как преобразуются отрицательные целые в 16-ричную систему счисления! V>Модератору: Пожалуйста, не удаляйте мой вопрос хотя бы пару часов! V>Спасибо.
По поводу представления:
Десятичная Двоичная Шестнадцатиричная Десятичная без знака
со знаком
----------------------------------------------------------------------
-1 111111111 FF 255
+
1 000000001 01 1
----------------------------------------------------------------------
0 000000000 00 0 (при 8 битовой арифметике)
Поэтому все очень просто:
1) MS specific:
#include <stdlib.h>
...
int i = -10;
char buffer[20];
const char* result = _itoa(i, buffer, 16);
2) STL
#include <strstream>
#include <iomanip>
...
int i = -10;
char buffer[20];
std::ostrstream stream(buffer);
stream << std::hex << i;
3) LIBС:
#include <stdio.h>
int i = -10;
char buffer[20];
sprintf(buffer, "%X", i);
Есть еще четвертый — самопальный. Поищите в "Исходниках". Удачи.
Здравствуйте, veronika, Вы писали:
V>Еще вопрос: если я не знаю заранее отрицательное или положительное HEX-число я получила, как мне определить, что получено отрицательное?
Сравнить с нулем
А если двоичными средствами — то проверить старший бит.
Например,
long L;
shoft S;
char C;
.....
if(L & 0x80000000) cout << "L is negative" << endl;
if(S & 0x8000) cout << "S is negative" << endl;
if(C & 0x80) cout << "C is negative" << endl;
V>Еще вопрос: если я не знаю заранее отрицательное или положительное HEX-число я получила, как мне определить, что получено отрицательное?
Не получиться определить, поскольку полученное hex число можно интерпретировать как целое со знаком, так и без него. Если вы полученное число будете приводить к long и int, то старший бит определит знак числа, а если к unsigned long или int — нет.
Здравствуйте, veronika, Вы писали:
V>Как преобразуются отрицательные целые в 16-ричную систему счисления!
Не понимаю, в чем сложность. Берешь число по модулю, переводишь в 16-ричную систему счисления, затем приписываешь спереди знак '-'. Например '-16' дает '-10h'.
Здравствуйте, veronika, Вы писали:
V>>Как преобразуются отрицательные целые в 16-ричную систему счисления!
V>Как в HEX — я уже нашла, а вот как обратно из такого HEX получить правильное отрицательное число? При обратном преобразовании получается очень большое положительное .
Вопрос бессмысленен, до тех пор пока не уточнено, что имеется виду под HEX.