Здравствуйте, MTimur, Вы писали:
MT>Это не помогает потому что Вы не обращаете внимание на типы данных.
MT>если what[0] у Вас 0xFF (-1), то
MT>MT> int a = what[0];
MT>unsigned int b = what[0];
MT>
MT>дадут результат:
MT>a = -1 = 0xFFFFFFFF (что у Вас и происходит)
MT>b = 255 = 0x000000FF (аналогичный результат получите, если наложите на a маску 0xFF)
Ненене! Преобразование /*signed*/ char -> unsigned int приводит к расширению знакового разряда, а если не приводит — то выкиньте такой компилятор нафиг (он не соответствует Стандарту).
Корректный способ получить unsigned int — это (unsigned int)
(unsigned char)what[0].
Ну или просто (unsigned char)what[0], а дальше он сам расширится до чего хотите — хоть до неотрицательного int, хоть до unsigned int.
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, MTimur, Вы писали:
MT>>Это не помогает потому что Вы не обращаете внимание на типы данных.
MT>>если what[0] у Вас 0xFF (-1), то
К>Ненене! Преобразование /*signed*/ char -> unsigned int приводит к расширению знакового разряда, а если не приводит — то выкиньте такой компилятор нафиг (он не соответствует Стандарту).
К>Корректный способ получить unsigned int — это (unsigned int)(unsigned char)what[0].
К>Ну или просто (unsigned char)what[0], а дальше он сам расширится до чего хотите — хоть до неотрицательного int, хоть до unsigned int.
Ну так вроде я это и написал... Или я не совсем понимаю о чем Вы.
здесь what[0] и есть /*signed*/ char
MT>> int a = what[0];
MT>>unsigned int b = what[0];
MT>>дадут результат:
MT>>a = -1 = 0xFFFFFFFF (что у Вас и происходит)
MT>>b = 255 = 0x000000FF (аналогичный результат получите, если наложите на a маску 0xFF)
А
здесьАвтор: MTimur
Дата: 14.05.09
написал, что правильный выход — сделать массив what беззнаковым.
Здравствуйте, b00tanik, Вы писали:
B>К сожалению, работаю не с консолью, вывожу в RichEdit строку, полученную такой функцией
Это называется — искусство грамотно задавать вопросы.
Если бы ты с самого начала привёл код, где ошибка проявляется, а не где она
предположительно зарождается, было бы на 10 левых сообщений меньше

Потому что ошибка зародилась прямо в точке проявления
Кстати сказать, грабли детские и от этого особенно больные.
На расширении char до int / size_t / etc. основаны и ошибки вывода, и даже расстрелы памяти.
Например, мы захотели сделать табличную функцию
enum category_bits
{
_cntrl_ = 1<<0,
_space_ = 1<<1,
_punct_ = 1<<2,
_alpha_ = 1<<3,
_digit_ = 1<<4,
};
unsigned const cp1251_categories[255] = { ....... };
bool isalpha_cp1251(char c) { return cp1251_categories[ (unsigned char)c ] & _alpha_; }
Без кастинга получим вылет далеко-далеко в минус.
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Здравствуйте, MTimur, Вы писали:
MT>Ну так вроде я это и написал... Или я не совсем понимаю о чем Вы.
MT>>> int a = what[0];
MT>>>unsigned int b = what[0];
Если what[0] — /*signed*/ char, то a=-1, b=(unsigned)-1=0xFFFFFFFF.
Если what[0] — unsigned char, то a=b=0x000000FF.
Как тебе удалось получить
MT>>>a = -1 = 0xFFFFFFFF (что у Вас и происходит)
MT>>>b = 255 = 0x000000FF (аналогичный результат получите, если наложите на a маску 0xFF)
это загадка из загадок.
А использовать unsigned char переменную — это
— тот же самый кастинг к unsigned char — только неявный (в месте, где она присваивается)
— не всегда возможно и не всегда корректно
char[] — как правило, строка. unsigned char[] — просто массив байтов.
Скажем, GetHex("hello") или GetHex(AnsiString("hello")) — в обоих случаях на входе именно строка. Можно, конечно, поплясать с бубном:
AnsiString GetHex(const unsigned char*);
AnsiString s = "hello";
.....
GetHex((const unsigned char*)(const char*)s);
А смысл? Сперва создать себе сложности, потом героически их побороть.
Пусть уж лучше внутри GetHex корректно работает с байтами, получаемыми из символов.
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>