С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218

Как работает приведение типов

06.11.2012, 10:06. Показов 1459. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил создать новую тему, так как вообще не понимаю, каким образом C++ преобразует один тип в другой. Я например пишу:
C++
1
2
char s = '5';
cout << (int)s;
и получаю 53 вместо 5. Тоже самое касается и определенных в WinAPI типов. Когда я привожу тип LCSTR к типу int (только не спрашивайте зачем), то получаю в ответ четыреста с лишним тысяч, хотя должно быть не больше 255.
Объясните (желательно с примерами), как работает приведение типов в C++. Какие вообще способы существуют?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.11.2012, 10:06
Ответы с готовыми решениями:

Приведение типов данных
Всем привет! Нашел в интернете вот такой код: #include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; void ReRun() { ...

Как работает приведение типов
#include &lt;stdio.h&gt; int main(void) { printf(&quot;%d&quot;, (int*)3 + 4); return 0; } То что выведется 19 проверить можно. Но...

Приведение типов: как работает reinterpret_cast<>() ?
Хочу разобраться до конца с приведением типов а именно интересует reinterpret_cast&lt;&gt;(), хотя бы в общих чертах логика этой функции, на...

9
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
06.11.2012, 10:44
Насчёт твоего примера. Необходимо помнить, что все символы некоторым образом закодированы. Открой где-нибудь таблицу кодировок символов
http://biocyborg.narod.ru/rev/ascii.htm
и ты увидишь, что символ '5' закодирован числом 53. Ну то есть если тебе необходимо представить число 53 в виде символа, то выведется символ '5' и наоборот, если тебе надо представить символ '5' в виде числа, то выведется 53. Что и происходит, так что всё правильно и предсказуемо.
0
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
06.11.2012, 11:52  [ТС]
А если у меня например строка "0xFF", то как ее перевестив целочисленное?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
06.11.2012, 11:54
atoi
.
0
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
06.11.2012, 12:04  [ТС]
Цитата Сообщение от Vourhey Посмотреть сообщение
atoi
.
Эта функция мне постоянно выдает ноль, когда я перевожу строку типа LCSTR к int:\ пытался привестик другим типам уже внутри функциия, но эффект аналогичный

Добавлено через 4 минуты
в общем вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TCHAR ColorCode[6];
        LPCSTR red, green, blue;
        int i = 0, ColorRed = 0, ColorGreen = 0, ColorBlue = 0;
case WM_COMMAND:
             if(LOWORD(wParam) == ID_BUTTON) {
                 if(i == 1) {SetRect(&rect, 5, 150, 100, 250); InvalidateRect(hwnd, &rect, 1);}
                 i++;
                 GetWindowText(Edit, ColorCode, 7);
                 red = "0x" + ColorCode[0] + ColorCode[1];
                 green = "0x" + ColorCode[2] + ColorCode[3];
                 blue = "0x" + ColorCode[4] + ColorCode[5];
                 ColorRed = (int)red;
                 ColorGreen = (int)green;
                 ColorBlue = (int)blue;
                 sprintf(ColorCode_2, "%u", ColorGreen);
                 hDC = GetDC(hwnd);
                 TextOut(hDC, 10, 200, ColorCode_2, strlen(ColorCode_2));
                 SetRect(&rect, 350, 0, 500, 360);
                 FillRect(hDC, &rect, CreateSolidBrush(RGB(ColorRed, ColorGreen, ColorBlue)));
                 ReleaseDC(hwnd, hDC);
                 }
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
06.11.2012, 12:30
Цитата Сообщение от angryjack93 Посмотреть сообщение
мне постоянно выдает ноль
Если число не в десятичной системе счисления, то да. Для 16-ричных числе можешь strtol использовать.
0
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
06.11.2012, 12:44  [ТС]
ну и? все равно ноль выдает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 char *a, *b, *c;
case WM_COMMAND:
             if(LOWORD(wParam) == ID_BUTTON) {
                 if(i == 1) {SetRect(&rect, 5, 150, 100, 250); InvalidateRect(hwnd, &rect, 1);}
                 i++;
                 GetWindowText(Edit, ColorCode, 7);
                 red = "0x" + ColorCode[0] + ColorCode[1];
                 green = "0x" + ColorCode[2] + ColorCode[3];
                 blue = "0x" + ColorCode[4] + ColorCode[5];
                 ColorRed = strtol(red, &a, 16);
                 ColorGreen = strtol(green, &b, 16);
                 ColorBlue = strtol(blue, &c, 16);
                 sprintf(ColorCode_2, "%u", ColorGreen);
                 hDC = GetDC(hwnd);
                 TextOut(hDC, 10, 200, ColorCode_2, strlen(ColorCode_2));
                 SetRect(&rect, 350, 0, 500, 360);
                 FillRect(hDC, &rect, CreateSolidBrush(RGB(ColorRed, ColorGreen, ColorBlue)));
                 ReleaseDC(hwnd, hDC);
                 }
если я конечно правильно функцию использовал
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
06.11.2012, 12:56
По-хорошему-то должен написать: вот в функцию такую-то я подаю то-то и то-то, на выходе то-то и то-то вместо ожидаемого. А у тебя чёрт ногу сломит.

Цитата Сообщение от angryjack93 Посмотреть сообщение
sprintf(ColorCode_2, "%u", ColorGreen);
...я сам должен догадаться, что такое ColorCode_2?

C++
1
2
3
red = "0x" + ColorCode[0] + ColorCode[1];
green = "0x" + ColorCode[2] + ColorCode[3];
blue = "0x" + ColorCode[4] + ColorCode[5];
явно видно, что этот код имеет отношение к проблемному вызову sprintf (в последнем я не уверен), как свинья к апельсинам. Зачем ты его пишешь? Что бы я споткнулся о него. Ладно, я споткнулся.
0
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
06.11.2012, 17:41  [ТС]
не, он тут просто, чтобы узнать какое число хранится в ColorGreen а вот в нем хранится как раз таки ноль. Я и хочу узнать почему

Добавлено через 4 часа 32 минуты
Ну народ, поможете кто или нет? Мне уже запарилось самому, пришлось перейти на метод тыка уже((((
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        TCHAR ColorCode[6];
        LPCSTR red, green, blue;
        int i = 0, ColorRed = 0, ColorGreen = 0, ColorBlue = 0;
        case WM_COMMAND:
             if(LOWORD(wParam) == ID_BUTTON) {
                 if(i == 1) {SetRect(&rect, 5, 150, 100, 250); InvalidateRect(hwnd, &rect, 1);}
                 i++;
                 GetWindowText(Edit, ColorCode, 7);
                 red = "0x" + ColorCode[0] + ColorCode[1];
                 green = "0x" + ColorCode[2] + ColorCode[3];
                 blue = "0x" + ColorCode[4] + ColorCode[5];
                 ColorRed = strtol(red, NULL, 16);
                 ColorGreen = strtol(green, NULL, 16);
                 ColorBlue = strtol(blue, NULL, 16);
                 hDC = GetDC(hwnd);
                 SetRect(&rect, 350, 0, 500, 360);
                 FillRect(hDC, &rect, CreateSolidBrush(RGB(ColorRed, ColorGreen, ColorBlue)));
                 ReleaseDC(hwnd, hDC);
                 }
Вот в общем весь кодо сообщения и я ваще не впариваю как тут да что сделать для вывода нужного цвета в прямоугольнике
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
06.11.2012, 17:58
Чего ты творишь?

C++
1
2
3
4
5
6
7
8
9
10
        case WM_COMMAND:
            if(LOWORD(wParam)==ID_BUTTON)
            {
                GetWindowText(Edit, ColorCode, 6);
                DWORD color = strtol(ColorCode, NULL, 16);
                 hDC = GetDC(hwnd);
                 SetRect(&rect, 350, 0, 500, 360);
                 FillRect(hDC, &rect, CreateSolidBrush(RGB(GetRValue(color), GetGValue(color), GetBValue(color))));
                 ReleaseDC(hwnd, hDC);
            }
, только не забудь удалять созданную кисть, а то у тебя утечка будет...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.11.2012, 17:58
Помогаю со студенческими работами здесь

Объясните, как в примере работает приведение типов
Вот такой пример: #include &lt;stdio.h&gt; #include &lt;pthread.h&gt; void * any_func (void * arg) { int a = *(int *) arg; a++; ...

Не требуется приведение типов при умножении типов Byte
Читал тут книгу(Г. Шилдт, &quot;Полный справочник по C#&quot;), и нашел такое (ст. 77) Поскольку при умножении, например, 2 чисел типа byte,...

Неправильное приведение типов или как?
Короче вот код void CMyDialog::OnBnClickedButtonEdit() { double number ; CString t; number= (t_f+t_o+t_m+t_d+t_b+t_i+t_s)/7; ...

float to double. Как происходит приведение типов?
double x = 1.01F; float y = 1.01F; Console.Write(x); // 1.00999 Console.WriteLine(); Console.Write(y); // 1.01 Console.Read(); ...

Работа с типом Object: как лучше реализовать приведение типов и сравнение
Добрый день Такая задача, есть COM-объект возвращающий по запросу некие переменные другой программы, которые могут быть типа: Integer,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru