Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

Две разных переменных по одному адресу

14.12.2015, 02:16. Показов 2046. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что это за юмор такой?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <new>
 
using namespace std;
 
int main() {
 
   double *a= new double{200};
   int *b = new(a) int{256};
 
   cout << a << " == " << b << "\n";
   cout << *a << " == " << *b << "\n";
 
   delete a;
}
output:
адрес один, но на нем как будто 2 независимых значения.
200==256
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.12.2015, 02:16
Ответы с готовыми решениями:

Две экспортные функции по одному адресу
Здравствуйте. Использую для экспорта: extern &quot;C&quot; __declspec(dllexport) __declspec(noinline) Но две функции вышли по одному...

Две переменных по одному адресу без unsafe code - возможно ли
Если у меня есть два объекта разных типов A и B. Можно ли без использования unsafe code сделать так, чтобы поля (например, типа int)...

Поиск фамилий двух людей, живущих в разных городах по одному адресу
составьте программу,осуществляющую поиск фамилий двух людей, живущих в разных городах по одному адресу. помогите плиз)) очень надо

12
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
14.12.2015, 02:31
daslex, типы разные, интерпретация данных тоже разная.

Добавлено через 2 минуты
То что ты проделал равносильно фокусу с
C++
1
2
3
4
union A{
  double a;
  int b;
}
1
Неэпический
 Аватар для Croessmah
18145 / 10729 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
14.12.2015, 02:32
double - 8 Байт, а int, скорее всего 4, поэтому перезаписываются только старшие байты значения double. Поменяйте int на int64_t и увидите разницу
2
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
14.12.2015, 02:36
Цитата Сообщение от Croessmah Посмотреть сообщение
Поменяйте int на int64_t и увидите разницу
Разница и так видна, если смотреть это дело в отладчике.
cout в стандартном режиме любит все округлять.
1
Неэпический
 Аватар для Croessmah
18145 / 10729 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
14.12.2015, 02:39
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Разница и так видна
как видите, не вооруженным глазом не видна разве что вывод настроить.
Ну а с int64_t видно сразу
1
14.12.2015, 02:45

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
не вооруженным глазом не видна
Тогда извиняюсь, я давно привык работать через отладчик, а к выводу в консоль прибегаю только в крайнем случае.

0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
14.12.2015, 03:10  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Разница и так видна, если смотреть это дело в отладчике.
Ну и что я там должен увидеть. В отладчике VS я вижу тоже самое, что я вижу и без отладчика.

Цитата Сообщение от Croessmah Посмотреть сообщение
Ну а с int64_t видно сразу
аналогично.

Ну я понял, что интерпретация разная. Что старшие байты перезаписываются.
Только назрел дополнительный вопрос. Каким большим должно быть число, чтобы на платформе x86 изменением данных в double изменились обе переменные?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <new>
 
using namespace std;
 
int main() {
 
    double *a = new double{ 200 };
    int *b = new(a) int{ 256 };
 
    cout << a << " == " << b << "\n";
    cout << *a << " == " << *b << "\n";
 
    size_t i = -1;
 
    *b += i;
 
    cout << i << '\n';
 
    cout << a << " == " << b << "\n";
    cout << *a << " == " << *b << "\n";
 
    delete a;
    cin.get();
}
*a осталось каким было. а не похоже, что должно было.

Добавлено через 5 минут
хотя на x64 лучше. Там же тоже 15 значащих после точки.
изменением *b, тип которого double, затронулось *a, тип которого int
вот правильная формулировка'
0
Неэпический
 Аватар для Croessmah
18145 / 10729 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
14.12.2015, 03:26
Цитата Сообщение от daslex Посмотреть сообщение
*a осталось каким было. а не похоже, что должно было.
http://rextester.com/DOJN12148

Ну и намного эффективнее будет поменять *a = 343 ;

Добавлено через 4 минуты
Цитата Сообщение от daslex Посмотреть сообщение
аналогично.
http://rextester.com/ZJU95526
1
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
14.12.2015, 03:46
Цитата Сообщение от daslex Посмотреть сообщение
В отладчике VS я вижу тоже самое, что я вижу и без отладчика.
А я вижу в указателе на double 200.00000000000000 до изменения второго и 200.00000000000728 после инициализации данных по второму указателю.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
14.12.2015, 03:57  [ТС]
А вот ничего и не понятно.
Я понимаю, что такое замещение. Но не очень понимаю маленькой, может быть никому не нужной детали.
Пишите мне, что старшие байты перезаписываются. Хорошо, думаю, если перезаписывать старшие байты, то при достаточно большом числе, рано или поздно байты из типа double должны наползти на байты типа int. На сайте в онлайн я это увидел. Да, там много "единичек" изменилось. Но в двух компиляторах в оффлайн числа почти остались неизменны. В VS x86 и x64 отладчик отдаёт одно и то же. Вот это уже не так уж и понятно.

на рис. clang 3.7 и VS2015/ x - это *a до изменения.
Миниатюры
Две разных переменных по одному адресу   Две разных переменных по одному адресу  
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
14.12.2015, 04:32
Цитата Сообщение от daslex Посмотреть сообщение
Пишите мне, что старшие байты перезаписываются.
Тут скорее перезаписываются не старшие байты, а младшие.
В типе double первые 52 бита отводятся под мантиссу, значит int будет попадать только на мантиссу.
Думаю, если вкурить вики, вы сможете все посчитать.

Добавлено через 19 минут
Записывая в double значение 200 мы получаем порядок 1030, с таким порядком мы получаем множитель 2^7.
Значит изменение мантиссы на единицу приведет к изменению значения вещественного числа на величину https://www.cyberforum.ru/cgi-bin/latex.cgi?{2}^{-45}. Int охватывает только первые 32 бита мантиссы, так что сильных изменений на значение вещественного числа мы оказать не сможем.
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
07.03.2018, 13:02
Цитата Сообщение от daslex Посмотреть сообщение
Что это за юмор такой?
Называется undefined behavior.
0
Неэпический
 Аватар для Croessmah
18145 / 10729 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
07.03.2018, 13:04
rat0r, Вы некрофил?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.03.2018, 13:04
Помогаю со студенческими работами здесь

Написать программу, определяющую , есть ли 2 человека, живущих в разных городах по одному адресу
Написать программу *Ирония судьбы*, определяющую , есть ли 2 человека, живущих в разных городах по одному адресу..! помогите на турбо...

Два разных АЦП разных устройств к одному датчику
похожий вопрос вроде поднимался по-моему пару лет назад. но теперь условия несколько иные, и добавилось конкретики. вот есть у меня...

Разные данные из БД по одному адресу
всем привет. подскажите как показывать одну и ту же страницу с разными данными из БД по разным логинам пользователей? как лучше это...

Может ли printf выводить разные данные по одному адресу?
Здравствуйте, программеры. Не первый год программирую, но отчаялся уже, топчусь второй день на одном месте и ничего не могу понять... ...

Как могут два процесса работать по одному адресу
С самого начала, как я стал изучать СТРУКТУРУ PE-заголовков у меня возник вопрос к ImageBase, который стандартно у большинства программ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru