long long
, кажется, 64-разрядные и int
32-разрядное число на вашей архитектуре. Вы используете 32-разрядные целые ссылки, поэтому вы только изменили менее значительную половину (вы, очевидно, компилируете на обычную машину x86, которая использует little endian и два дополнения для знакового целочисленного представления).
Знак бит, а также более значительная половина - это все 0
s (как инициализировано). Это должно было бы быть 1
s печатать то же отрицательное значение:
0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1100
^ ^
sign bit of long long sign bit of int
reinterpret_cast
только гарантирует, что вы получите обратно ваш int
с другим reinterpret_cast
, так что вы либо распечатать его как int
или использовать long long &
параметр.
Подписанное целочисленное представление, endianess, вы называете его. Вот почему вы не используете 'reinterpret_cast'. – StoryTeller
@StoryTeller Я знаю, 'reinterpret_cast' плохо, но почему это происходит? –
Это не «плохо», он просто делает то, что вы не можете надежно предсказать на каждой архитектуре. Вы берете ссылку на большой объект, а не рассматриваете его как ссылку на маленький объект. У вас нет гарантии, что вы будете манипулировать «правильной» частью более крупного объекта. – StoryTeller