Re[8]: Проблема с преобразованием типов
От: Кодт Россия  
Дата: 15.05.09 14:21
Оценка:
Здравствуйте, 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>>
Перекуём баги на фичи!
Re[9]: Проблема с преобразованием типов
От: MTimur  
Дата: 15.05.09 14:40
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, 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 беззнаковым.
Re[5]: Проблема с преобразованием типов
От: Кодт Россия  
Дата: 15.05.09 14:44
Оценка:
Здравствуйте, 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>>
Перекуём баги на фичи!
Re[10]: Проблема с преобразованием типов
От: Кодт Россия  
Дата: 15.05.09 15:06
Оценка: +2
Здравствуйте, 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>>
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.