Trame2771
@Trame2771

Справа налево или слева направо представляются данные в виде битов в ячейках?

Иными словами слева или справа идут младшие биты в ячейках
#include <iostream>
#include <typeinfo>

using namespace std;

int main()
{
	setlocale(0, "");
	
	long x = 20;

	long *pi = &x;
	short *ps = reinterpret_cast<short*>(&x) + 1;

	cout
	<< (static_cast<void*>(pi) == ps) << '\n';
	cout
	<< pi << '\n'
	<< ps << '\n'
	<< *pi << '\n'
	<< *ps << '\n';

	return 0;
}

Output:
0 // false
0x3bfdcc
0x3bfdce
20
0

Или это потому что адрес, больший другого, на самом деле не "правее", а "левее"?
*ps равен нулю, даже если отнять от ps единицу, а если прибавить или отнять больше единицы, то случайному значению. Он равен двадцать, только если ничего не прибавлять
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Правильный ответ - ни так и не эдак. Никак. Сравнивать указатели не из одного и того же массива - undefined behavior. Это было недавно в статье на хабре. Там ссылаются на раздел 3.3.8, "Relational operators".

Более того, у вас там в программе еще UB: нельзя обращаться к данным в переменной long через указатель short - Это нарушение strict aliasing.

Таким образом, ваша программа может вывести что угодно, в зависимости от версии и настроек компилятора.

На практике - никаких лево и право там не существует, есть только младшие и старшие адреса, читайте про big/little endian порядки байт. Они там бывают и так и эдак в разных архитектурах. В x86, например, младший байт имеет меньший адрес.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы