Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Omnio
0 / 0 / 1
Регистрация: 19.07.2009
Сообщений: 50
#1

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

14.08.2016, 20:26. Просмотров 323. Ответов 6
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(void)
{
    printf("%d", (int*)3 + 4);
    return 0;
}
То что выведется 19 проверить можно.
Но умные люди разъясните, как это происходит и почему ?
http://www.cyberforum.ru/cpp-beginners/thread1895915.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2016, 20:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как работает приведение типов (C++):

Неправильное приведение типов или как?
Короче вот код void CMyDialog::OnBnClickedButtonEdit() { double number ;...

Строгая типизация. Только ручное приведение типов. Как не смешать яблоки с грушами?
Приветствую Вас, уважаемые форумчане! Вопрос, предполагаю, элементарный для...

Приведение типов
в GUI ни int str = static_convert&lt;int&gt;(Edit1-&gt;Text) ни int str =...

Приведение типов
Как компилятор заставить адекватней приводить типы? (VS2012) Например: int...

Приведение типов
Доброго времени суток. Пусть имеются две структуры struct Student {...

6
MansMI
1447 / 1156 / 549
Регистрация: 08.01.2012
Сообщений: 4,509
14.08.2016, 20:34 #2
3+4*sizeof(int)
0
Hikari
Хитрая блондиночка $)
1451 / 960 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
14.08.2016, 20:45 #3
Цитата Сообщение от Omnio Посмотреть сообщение
(int*)3
Это операция с расчетом смещения указателей.
Как я понимаю: (int*)3 - это расчет кол-ва ячеек памяти по 4 байта (3+1)*4=16, где +1 - потому что начало расчета с нуля
И плюс еще 4 - дает 20. 20 это байт смещения от указателя (int *)0. А учитывая отсчет не с единицы а с нуля получается 19, ибо 20, это если считать начало указателя с единицы.
Наверное не очень понятно описала?
0
hoggy
Заблокирован
14.08.2016, 20:47 #4
Цитата Сообщение от Omnio Посмотреть сообщение
как это происходит и почему ?
вот здесь:
C++
1
(int*)3
вы сообщаете компилятору, что цыферка 3 - это адрес памяти,
где сидит объект типа int.

далее:
C++
1
(int*)3 + 4
к полученному адресу прибавляется 4.
получается адрес, который смещен относительно исходного на 4ре штуки объектов типа int

размер одного объекта int в данном случае был 4.

от адреса 3 смещаемся на 4ре объекта каждый из которых весит 4.
то есть на 16 байт.

16 + 3 = 19.

таким образом, 19 - это адрес,
который получился в результате выражения:
C++
1
(int*)3 + 4
далее:
C++
1
printf("%d", (int*)3 + 4);
здесь функции printf сообщается,
что переданный адрес 19 нужно вывести как обычную циферку.

её мы в итоге и видим в результате.
0
meJevin
156 / 148 / 92
Регистрация: 18.11.2015
Сообщений: 674
Завершенные тесты: 1
14.08.2016, 21:11 #5
Блин, пока я писал свое супер-деревенское объяснение, хогги опередил с более правильным. Но ладно, не пропадать же виртуальным буковкам-циферкам, вот:



Кликните здесь для просмотра всего текста
Начнем с того, что запись (int*)3 - просто даст нам указатель на int со значением 3

Заметь, что не int со значением 3, а указатель на int, т.е. нам программа даст адрес.

Мы получим 00000000 00000003 в консоли, если напишем std::cout << (int*)3 << std::endl;. Это верно, представление тройки в шестнадцатеричной системе счисления (а она стоит по умолчанию при выводе адресов) так и запишется.

Далее, мы прибавляем к нашему адресу 4, т.е. наша запись приобретает вид (int*)3 + 4. И тут-то самое вкусное.

Если мы попытаемся вывести в консоль std::cout << (int*)3 + 4 << std::endl;, то получим 00000000 000000013. Но почему? Мы же всего лишь 4 прибавили к 3, мы должны были получить 7, не так ли? Нет, не так.

Давай вспомним, что мы работаем с адресами и указателями, а с ними простая арифметика работает не так, как может подумать неопытный программист. Дело в том, что когда мы говорим программе прибавить, например 4, к указателю, то программа не просто увеличит адрес, который держит наш указатель на 4, а "перепрыгнет" через 4 переменных типа, на который указывает указатель. Т.е. программа возьмет размер (в байтах) типа переменной, на которую указывает указатель, и прибавит к адресу указателя столько раз, сколько мы сказали ей "прыгнуть".


С полученными знаниями, мы можем сами посчитать, какой будет адрес, если мы пишем (int*)3 + 4. Итак, значение (в шестнадцатеричной системе счисления) (int*)3 мы уже знаем, будет 00000000 00000003. Далее, мы говорим к текущему адресу прибавить 4. Используя вышеописанный способ вычисления адреса после перемещения указателя на N раз, мы можем вычислить будущий адрес. Так как программа "перепрыгивает" N раз через размер типа, на которую указывает указатель, который в нашем случае int, мы должны перепрыгнуть через 4 int переменных. Таким образом, мы перепрыгнем через 16 (т.к. размер int 4 байта) байт и окажемся на 00000000 000000013. И ответ верный, ведь прибавив 16 к имеющимся 3 мы получим 19, что записывается, как 00000000 000000013 в шестнадцатеричной системе счисления.


Вот и все
0
gogaloh
15 / 19 / 11
Регистрация: 14.03.2015
Сообщений: 603
14.08.2016, 22:49 #6
meJevin, даже не думаю тебе льстить, но скажи какую книгу по С++ ты считаешь правильной
0
meJevin
156 / 148 / 92
Регистрация: 18.11.2015
Сообщений: 674
Завершенные тесты: 1
14.08.2016, 23:23 #7
gogaloh, не могу ответить на этот вопрос. Я еще не достаточно владею С++, чтобы книги правильными или неправильными назначать
0
14.08.2016, 23:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2016, 23:23
Привет! Вот еще темы с решениями:

приведение типов
Объясните, пожалуйста, почему возникает такая ошибка: error C2666: 'operator...

Приведение типов
Делаю программу, которая кроме всего прочего должна отсортировать массив....

Приведение типов
При вводе с клавиатуры s = 11 и a = 1.1, получаем 9. Результат переменной d =...

Приведение типов?
Подскажите, пожалуйста что происходит. Не понимаю почему такой код работает....


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru