2016-01-15 3 views
1

Почему результат 4294967292 вместо -4, даже если подписаны оба целочисленных типа?reinterpret_cast подписанного значения int

#include <iostream> 

void f(int & i) 
{ 
    i = -4; 
} 

int main() 
{ 
    long long i = 0; 
    f(reinterpret_cast<int &>(i)); 
    std::cout << i << std::endl; 
    return 0; 
} 
+0

Подписанное целочисленное представление, endianess, вы называете его. Вот почему вы не используете 'reinterpret_cast'. – StoryTeller

+0

@StoryTeller Я знаю, 'reinterpret_cast' плохо, но почему это происходит? –

+1

Это не «плохо», он просто делает то, что вы не можете надежно предсказать на каждой архитектуре. Вы берете ссылку на большой объект, а не рассматриваете его как ссылку на маленький объект. У вас нет гарантии, что вы будете манипулировать «правильной» частью более крупного объекта. – StoryTeller

ответ

6

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 & параметр.

+3

.. и -4 и 4294967292 имеют одинаковое двоичное представление .. просто указывая на это. – Default

Смежные вопросы