| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > GNU toolchain > Проблемы с преобразованием типов данных в MinGW |
| Автор: AliensX 22.12.2008, 12:51 | ||
| Приветствую, уважаемые кодеры. При написании некоторого приложения, используя компилятор MinGW 5.1.4, столкнулся с некоторой очень странной проблемой, для того, чтобы объяснить суть проблемы, приведу небольшой незамысловатый код:
Здесь мы имеем целочисленную переменную, которую используем в качестве кода символа для переменной x. Далее мы обратно преобразуем получившейся символ в целочисленный тип. Очевидно, что результатом выполнения данного кода должен быть результат 210 210 Однако, результат выполнения совсем другой: -46 -46 Возможно, я просто что-то не понимаю, но идей по поводу как такое в принцепи может быть никаких нету, разве что оно как-то связано с текущей кодировкой. Стоит отметить, что если использовать другие коды символов, например, 12, то результат выполнения получается правильным. Но 210 далеко не единственный код, при котором программа ведет себя некорректно. Очень хочется услышать предположения знающих людей по этому поводу. Спасибо. |
| Автор: KaraKum 22.12.2008, 13:06 |
| Вот в чём дело: В числах со знаком (а это все числа, если специально не указать unsigned) самый старший бит отвечает за сам знак (либо плюс - либо минус), поэтому в char (которая величиной только 8 бит) остаётся только 7 бит на само число (таким образом char может представлять только числа от -127 до +128). Для преобразований меньших 128 - результат будет оставаться верным - дальше уже будет коверкаться, но не по обычной логике, потому что отрицательное число - это не само число с установленным самым старшим битом, а его дополнение (например, -1 - это не 10000001, а 11111111). |
| Автор: AliensX 22.12.2008, 13:32 | ||||
Премного благодарен за развернутый ответ! Я в c++ новичок, раньше разрабатывал приложения только на PHP, где все преобразования за тебя делает язык. На данный момент по стечению обстоятельств пришлось писать сетевую программу, которую на PHP разработать, конечно, можно, но, увы, там отсутствует многопоточность. Поэтому в спешке пришлось изучать c++. До сих пор некоторые вещи не ясны. А в сетевых программах часто приходится преобразовывать типы данных, там нужна большая точность, иначе, все полетит. Очень прошу переделать код таким образом, чтобы можно было обратно получить заветный код символа. Заранее спасибо! ------------- Немного погодя... Разобрался! Стоило изменить операцию вот таким вот образом:
Как все стало работать так, как нужно! Ещё раз спасибо за ответ! Сам бы догадался очень-очень не скоро. Тему можно убивать |
| Автор: KaraKum 22.12.2008, 13:43 | ||
Программа будет печатать восклицательный знак в косноли в обоих функциях. |